diff --git a/.dockerignore b/.dockerignore index 62b03e692c..518dcea8db 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,14 @@ build/ +.github +assets +docker +**/*.md +**/README* +**/LICENSE* + +# Ignore all go test files as no tests are run during docker build. +**/*_test.go + # The .git folder must be transferred to Docker context since the Makefile # uses git commands to get the current commit hash and tag for versioning. # .git/ \ No newline at end of file diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 8aa6cac24b..8dbd641090 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -32,5 +32,5 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Validate Docker build (amd64) - run: docker build --platform=linux/amd64 --target=go-builder . + run: docker build --platform=linux/amd64 . diff --git a/CHANGELOG.md b/CHANGELOG.md index 60771c7c4e..63e522217f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,119 @@ Ref: https://keepachangelog.com/en/1.0.0/ --> # Changelog +## v6.3 +sei-chain (Note: major repos have been merged into sei-chain) +[#2580](https://github.com/sei-protocol/sei-chain/pull/2580) Fix: enforce EIP-6780 selfdestruct for prefunded addresses +* [#2572](https://github.com/sei-protocol/sei-chain/pull/2572) Extra checks in BitArray methods +* [#2570](https://github.com/sei-protocol/sei-chain/pull/2570) Strongly typed p2p channels +* [#2567](https://github.com/sei-protocol/sei-chain/pull/2567) Migrate sei-ibc-go into sei-chain as monorepo +* [#2563](https://github.com/sei-protocol/sei-chain/pull/2563) Do not return error string on precompile error +* [#2561](https://github.com/sei-protocol/sei-chain/pull/2561) Make seid rollback idempotent and remove --hard +* [#2560](https://github.com/sei-protocol/sei-chain/pull/2560) Fix: Resolve data race in parallel snapshot writing +* [#2558](https://github.com/sei-protocol/sei-chain/pull/2559) Remove custom json encoding of consensus internals and replay command +* [#2558](https://github.com/sei-protocol/sei-chain/pull/2558) Refactor of consensus reactor task management +* [#2553](https://github.com/sei-protocol/sei-chain/pull/2553) Refactor CheckTx +* [#2547](https://github.com/sei-protocol/sei-chain/pull/2547) Deprecate and clean up dbsync code reference +* [#2543](https://github.com/sei-protocol/sei-chain/pull/2543) Add a benchmark mode +* [#2542](https://github.com/sei-protocol/sei-chain/pull/2542) Config: Make worker pool configurable and increase default queue size +* [#2540](https://github.com/sei-protocol/sei-chain/pull/2540) Streamline EndBlock +* [#2539](https://github.com/sei-protocol/sei-chain/pull/2539) PeerManager rewrite +* [#2537](https://github.com/sei-protocol/sei-chain/pull/2537) Optimzation: Reduce snapshot creation time +* [#2534](https://github.com/sei-protocol/sei-chain/pull/2534) Remove ABCI socket/grpc functionality +* [#2533](https://github.com/sei-protocol/sei-chain/pull/2533) Migrate transaction embedding proto types to Go types +* [#2528](https://github.com/sei-protocol/sei-chain/pull/2528) Watermark fixes +* [#2527](https://github.com/sei-protocol/sei-chain/pull/2527) Darwin build fix +* [#2525](https://github.com/sei-protocol/sei-chain/pull/2525) Deprecate store streaming and listeners +* [#2522](https://github.com/sei-protocol/sei-chain/pull/2522) Flatten BeginBlock and remove nested logic +* [#2521](https://github.com/sei-protocol/sei-chain/pull/2521) Fix base field parsing for sei-cosmos toml +* [#2520](https://github.com/sei-protocol/sei-chain/pull/2520) Minor refactor to tracing +* [#2519](https://github.com/sei-protocol/sei-chain/pull/2519) Include price-feeder in seid container +* [#2517](https://github.com/sei-protocol/sei-chain/pull/2517) Remove vote extensions logic +* [#2516](https://github.com/sei-protocol/sei-chain/pull/2516) Use wire and wire-json to check for proto breaking changes +* [#2515](https://github.com/sei-protocol/sei-chain/pull/2515) Logging fixes +* [#2513](https://github.com/sei-protocol/sei-chain/pull/2513) Remove unused code pt 2 +* [#2512](https://github.com/sei-protocol/sei-chain/pull/2512) Remove unused code +* [#2511](https://github.com/sei-protocol/sei-chain/pull/2511) Fix logging message for restore +* [#2510](https://github.com/sei-protocol/sei-chain/pull/2511) Get rid of god-cache janitor +* [#2509](https://github.com/sei-protocol/sei-chain/pull/2509) Address comments for tendermint p2p +* [#2507](https://github.com/sei-protocol/sei-chain/pull/2507) Remove SimApp and Cosmos simulation logic +* [#2506](https://github.com/sei-protocol/sei-chain/pull/2506) Fix: Set MinRetainBlocks=0 for archive node +* [#2504](https://github.com/sei-protocol/sei-chain/pull/2504) Remove aclaccesscontrol module and usages +* [#2503](https://github.com/sei-protocol/sei-chain/pull/2503) Fix sei-db race conditions +* [#2497](https://github.com/sei-protocol/sei-chain/pull/2497) Feat: optimize memIAVL cold-start with sequential snapshot prefetch +* [#2494](https://github.com/sei-protocol/sei-chain/pull/2494) Fix bloom fallback behavior +* [#2491](https://github.com/sei-protocol/sei-chain/pull/2491) Fix gap nonce inclusion +* [#2490](https://github.com/sei-protocol/sei-chain/pull/2490) Config: reorganize configuration files with auto-managed fields settings +* [#2487](https://github.com/sei-protocol/sei-chain/pull/2487) Made tendermint reactors open channels in constructor +* [#2485](https://github.com/sei-protocol/sei-chain/pull/2485) Disable HashRange by default +* [#2484](https://github.com/sei-protocol/sei-chain/pull/2484) Fix compile error in sei-wasmd +* [#2480](https://github.com/sei-protocol/sei-chain/pull/2480) Remove redundant codecov config in sei-db and fix coverage upload +* [#2479](https://github.com/sei-protocol/sei-chain/pull/2479) Config: set pruning=nothing for all nodes +* [#2476](https://github.com/sei-protocol/sei-chain/pull/2476) DNS resolution test for ResolveAddressString +* [#2475](https://github.com/sei-protocol/sei-chain/pull/2475) Fix pruning MVCC error +* [#2471](https://github.com/sei-protocol/sei-chain/pull/2471) Simplified p2p.Channel +* [#2470](https://github.com/sei-protocol/sei-chain/pull/2470) Reverted semantics of ParseAddressString +* [#2469](https://github.com/sei-protocol/sei-chain/pull/2469) Config: Keep rosetta.enable=false by default for all kidns of nodes +* [#2468](https://github.com/sei-protocol/sei-chain/pull/2468) Remove sqlite and make latest version update atomic in SS +* [#2467](https://github.com/sei-protocol/sei-chain/pull/2467) Simply tracer enabled checks throughout sei-chain/cosmos app +* [#2465](https://github.com/sei-protocol/sei-chain/pull/2465) Integrate watermark in evmrpc +* [#2463](https://github.com/sei-protocol/sei-chain/pull/2463) State store metrics PebbleDB +* [#2462](https://github.com/sei-protocol/sei-chain/pull/2462) Automate and fix ProtocolBuffer generation across all sub modules +* [#2460](https://github.com/sei-protocol/sei-chain/pull/2460) Cherry pick remaining seidb commits +* [#2458](https://github.com/sei-protocol/sei-chain/pull/2458) Port timeoutTicker fix +* [#2456](https://github.com/sei-protocol/sei-chain/pull/2456) Feat: Add mode-based configuration for seid init +* [#2454](https://github.com/sei-protocol/sei-chain/pull/2454) Fix RPC read race +* [#2452](https://github.com/sei-protocol/sei-chain/pull/2452) Cherrypick RPC CPU optimization changes +* [#2450](https://github.com/sei-protocol/sei-chain/pull/2450) Get sender in txpool with relevant signer +* [#2449](https://github.com/sei-protocol/sei-chain/pull/2449) Delete existing zeroed out EVM contract state +* [#2448](https://github.com/sei-protocol/sei-chain/pull/2448) Merged Router and Transport +* [#2446](https://github.com/sei-protocol/sei-chain/pull/2446) Delete future zeroed out state from chain state +* [#2443](https://github.com/sei-protocol/sei-chain/pull/2443) Add otel metric utils provider +* [#2442](https://github.com/sei-protocol/sei-chain/pull/2442) Fix to tcp conneciton leak +* [#2440](https://github.com/sei-protocol/sei-chain/pull/2440) Reverted SendRate/RecvRate=0 semantics +* [#2439](https://github.com/sei-protocol/sei-chain/pull/2439) Add metrics for nonce mismatch & pending nonce +* [#2435](https://github.com/sei-protocol/sei-chain/pull/2435) Bump SeiDB to include rocksdb +* [#2434](https://github.com/sei-protocol/sei-chain/pull/2434) Config: update sei-tendermint default configs +* [#2431](https://github.com/sei-protocol/sei-chain/pull/2431) Remove Transport mock +* [#2430](https://github.com/sei-protocol/sei-chain/pull/2422) Refactor of MConnection internals +* [#2428](https://github.com/sei-protocol/sei-chain/pull/2428) Increase tm event buffer to reduce critical path backpressure +* [#2423](https://github.com/sei-protocol/sei-chain/pull/2423) Config: update app config default values +* [#2422](https://github.com/sei-protocol/sei-chain/pull/2422) Fix sender discrepancy on RPC reads +* [#2421](https://github.com/sei-protocol/sei-chain/pull/2421) Fix: Add recovery on CreateProposalBlock +* [#2420](https://github.com/sei-protocol/sei-chain/pull/2420) Upgrade to go 1.24.5 +* [#2419](https://github.com/sei-protocol/sei-chain/pull/2419) Remove duplicate panic recovery in process proposal +* [#2418](https://github.com/sei-protocol/sei-chain/pull/2418) Remove prefill estimates scheduler code path +* [#2414](https://github.com/sei-protocol/sei-chain/pull/2414) Do not resolve latest upon error +* [#2412](https://github.com/sei-protocol/sei-chain/pull/2412) Add logic to handle single NFT claim +* [#2399](https://github.com/sei-protocol/sei-chain/pull/2399) Fix cosmos priority and add unit test +* [#2397](https://github.com/sei-protocol/sei-chain/pull/2397) Update error msg for v2 upgrade +* [#2389](https://github.com/sei-protocol/sei-chain/pull/2389) Parameterize SSTORE +* [#2388](https://github.com/sei-protocol/sei-chain/pull/2388) Cherrypick RPC fixes from v6.1.11 +* [#2377](https://github.com/sei-protocol/sei-chain/pull/2377) Fix block gas used +* [#2374](https://github.com/sei-protocol/sei-chain/pull/2374) Estimate gas fix +* [#2345](https://github.com/sei-protocol/sei-chain/pull/2345) Fix: Add panic recovery to ProcessProposalHandler goroutine +* [#2320](https://github.com/sei-protocol/sei-chain/pull/2320) Implement standalone transaction prioritizer + +Other fixes included that were squashed by monorepo work +* [Add otel metrics for seidb](https://github.com/sei-protocol/sei-chain/commit/c0e868d45adc00c0e27c932546c678a069b3d544) +* [Upgrade to Go 1.24 and fix lint issues](https://github.com/sei-protocol/sei-chain/commit/fcf9de74d902db49ff364918d8ed9079d28f0312) +* [Rocksdb update interface](https://github.com/sei-protocol/sei-chain/commit/e314508ebf75775d0c20ec7473ba5741ebc63f08) +* [Removed MemoryTransport](https://github.com/sei-protocol/sei-chain/commit/e8d4e7b867b418881c920dd0b6efcac15d854858) +* [MemIAVL Create snapshot whenever height diff exceeds interval](https://github.com/sei-protocol/sei-chain/commit/123dd8f7d8b5f9d1cf5d549e325fd058d79b30d9) +* [Fix cosmos limit big integer range](https://github.com/sei-protocol/sei-chain/commit/ef0bb143bfac512f029e88a0cdce810c5e542f19) +* [Add more trace spans to execution critical path](https://github.com/sei-protocol/sei-chain/commit/854381055c7e7a6917eab50e216fb1ddec5f77a8) +* [Add GetTxPriorityHint and mempool backpressure via priority drops](https://github.com/sei-protocol/sei-chain/commit/94f51a514582889c8af929698850d0032d3e74c1) +* [MemIAVL should only keep 1 snapshot](https://github.com/sei-protocol/sei-chain/commit/62ed63a645cb50e9c1aaa032f906afd4597edd8a) +* [Fix: Add recovery on CreateProposalBlock](https://github.com/sei-protocol/sei-chain/commit/6c96c70d2b6c114697dbba3eeb331b7a7a3c9a4f) +* [Refactor of TCP connection lifecycle](https://github.com/sei-protocol/sei-chain/commit/3bfb0fc260d77810411eb6e6d909f399d351c21a) +* [Fix cache max size for duplicate txs](https://github.com/sei-protocol/sei-chain/commit/7f34114feebaa0bb110bf9840ac1002121737f09) +* [Fix for contention on heightIndex in mempool](https://github.com/sei-protocol/sei-chain/commit/06dc2f6607662428ae222a70a95b1f646bfda388) +* [Remove support for vote extensions](https://github.com/sei-protocol/sei-chain/commit/b3c3ea55524296be0625be28eba796cb260e05cd) +* [Tendermint Estimate Gas Fix](https://github.com/sei-protocol/sei-chain/commit/4209f85fd264b9efcc6523f7723e7bf06e20f276) +* [Hardcoded simple-priority queue as the only message queue](https://github.com/sei-protocol/sei-chain/commit/44dcb81e7ce3f385034513d196d2352bd4d8c5bb) +* [Commit to metadata table for state analysis](https://github.com/sei-protocol/sei-chain/commit/859c9e9abf1a7af64dad95bf3fe93764b2ef80c1) +* [Only allow 1 tx per envelope](https://github.com/sei-protocol/sei-chain/commit/2b3572d052bf86b61426812872c523f7c99138df) + ## v6.2.0 sei-chain * [#2444](https://github.com/sei-protocol/sei-chain/pull/2444) Optimize getLogs performance @@ -80,6 +193,33 @@ sei-tendermint * [#289](https://github.com/sei-protocol/sei-tendermint/pull/289) Purge expired txs from mempool cleanly * [#287](https://github.com/sei-protocol/sei-tendermint/pull/287) Bump btcec to v2.3.2, x/crypto to v0.31.0 +## v6.2.0 +sei-chain +* [#2271](https://github.com/sei-protocol/sei-chain/pull/2271) Fix cumulativeGasUsed == 0 +* [#2262](https://github.com/sei-protocol/sei-chain/pull/2262) Consistent Gas Limit across RPC and Opcode +* [#2263](https://github.com/sei-protocol/sei-chain/pull/2263) Do not take a new snapshot upon RevertToSnapshot +* [#2272](https://github.com/sei-protocol/sei-chain/pull/2272) Add make target for mock balances +* [#2258](https://github.com/sei-protocol/sei-chain/pull/2258) Fix static fee history gas used ratio +* [#2269](https://github.com/sei-protocol/sei-chain/pull/2269) Add compile flagged mock balance testing functionality +* [#2265](https://github.com/sei-protocol/sei-chain/pull/2265) Bump geth to allow for skipping nonce bump +* [#2235](https://github.com/sei-protocol/sei-chain/pull/2235) Rate limit eth call in Simulation API +* [#2261](https://github.com/sei-protocol/sei-chain/pull/2261) Bump Geth for request size limit to 10MB +* [#2255](https://github.com/sei-protocol/sei-chain/pull/2255) Optimization: CreateAccount only clears state if code hash exists +* [#2238](https://github.com/sei-protocol/sei-chain/pull/2238) Bump btcec to v2.3.2, x/crypto to v0.31.0 +* [#2234](https://github.com/sei-protocol/sei-chain/pull/2234) Use legacy transaction decoder for historical height +* [#2250](https://github.com/sei-protocol/sei-chain/pull/2250) Make flushing receipt synchronous +* [#2251](https://github.com/sei-protocol/sei-chain/pull/2251) Update oracle MidBlock logic +* [#2256](https://github.com/sei-protocol/sei-chain/pull/2256) Fix data race in price-feeder websocket controller +* [#2236](https://github.com/sei-protocol/sei-chain/pull/2236) Harden solo precompile +* [#2232](https://github.com/sei-protocol/sei-chain/pull/2232) Require MsgClaim sender to match signer +* [#2239](https://github.com/sei-protocol/sei-chain/pull/2239) Remove writeset estimation to alleviate AccAddress mutex contention +* [#2233](https://github.com/sei-protocol/sei-chain/pull/2233) Exclude transactions that failed ante from getTransaction +* [#2210](https://github.com/sei-protocol/sei-chain/pull/2210) Refactor versioned precompiles & add automation scripts +* [#2225](https://github.com/sei-protocol/sei-chain/pull/2225) Fix tx index in getTransactionByHash response +* [#2218](https://github.com/sei-protocol/sei-chain/pull/2218) Add gov proposal for rechecktx +* [#2219](https://github.com/sei-protocol/sei-chain/pull/2219) Re-enable p256 precompile +* [#2074](https://github.com/sei-protocol/sei-chain/pull/2074) Pectra upgrade + go-ethereum * [#63](https://github.com/sei-protocol/go-ethereum/pull/63) Allow nonce bump to be skipped * [#62](https://github.com/sei-protocol/go-ethereum/pull/62) Expose set read limits for websocket server to prevent OOM @@ -799,4 +939,4 @@ sei-chain: * [#603](https://github.com/sei-protocol/sei-chain/pull/603) Set mempool ttl * [#612](https://github.com/sei-protocol/sei-chain/pull/612) Optimistic Processing should finish before main goroutine * [#613](https://github.com/sei-protocol/sei-chain/pull/613) Incorporate IAVL change that removes mutex locking -* Various audit fixes \ No newline at end of file +* Various audit fixes diff --git a/Dockerfile b/Dockerfile index d5a03a2850..36b8d097fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,22 @@ -# ---------- Builder ---------- -FROM docker.io/golang:1.24.5 AS go-builder -WORKDIR /app/sei-chain - -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && \ - rm -rf /var/lib/apt/lists/* +ARG SEICTL_VERSION=v0.0.5@sha256:268fc871e8358e706f505f0ce9ef318761e0d00d317716e9d87218734ae1a81c + +FROM ghcr.io/sei-protocol/seictl:${SEICTL_VERSION} AS seictl +FROM docker.io/golang:1.24-bookworm@sha256:fc58bb98c4b7ebc8211c94df9dee40489e48363c69071bceca91aa59023b0dee AS builder +WORKDIR /go/src/sei-chain + +COPY sei-wasmd/x/wasm/artifacts/v152/api/*.so /tmp/wasmd-libs/ +COPY sei-wasmd/x/wasm/artifacts/v155/api/*.so /tmp/wasmd-libs/ +COPY sei-wasmvm/internal/api/*.so /tmp/wasmvm-libs/ +ARG TARGETARCH +RUN mkdir -p /go/lib && \ + case "${TARGETARCH}" in \ + amd64) ARCH_SUFFIX="x86_64" ;; \ + arm64) ARCH_SUFFIX="aarch64" ;; \ + *) echo "Unsupported architecture: ${TARGETARCH}" && exit 1 ;; \ + esac && \ + cp /tmp/wasmd-libs/libwasmvm152.${ARCH_SUFFIX}.so /go/lib/ && \ + cp /tmp/wasmd-libs/libwasmvm155.${ARCH_SUFFIX}.so /go/lib/ && \ + cp /tmp/wasmvm-libs/libwasmvm.${ARCH_SUFFIX}.so /go/lib/ # Cache Go modules COPY go.work go.work.sum ./ @@ -16,56 +29,32 @@ COPY sei-ibc-go/go.mod sei-ibc-go/go.sum ./sei-ibc-go/ COPY sei-db/go.mod sei-db/go.sum ./sei-db/ RUN go mod download -# Copy source and build (CGO enabled for libwasmvm) COPY . . ENV CGO_ENABLED=1 -RUN make build build-price-feeder - -# Collect libwasmvm*.so: try ./seiwasmd; else auto-derive version and download glibc .so -ARG WASMVM_VERSION="" -RUN set -eux; \ - mkdir -p /build/deps; \ - LIBWASM_DIR="./sei-wasmd"; \ - found=0; \ - # Copy from module cache if present - FILES="$(find "$LIBWASM_DIR" -type f -name 'libwasmvm*.so' -print || true)"; \ - if [ -n "$FILES" ]; then \ - echo "$FILES" | xargs -r -n1 -I{} cp -v "{}" /build/deps/; \ - found=1; \ - fi; \ - # If not found, derive version (or use provided WASMVM_VERSION) and download - if [ "$found" -eq 0 ]; then \ - if [ -z "$WASMVM_VERSION" ]; then \ - WASMVM_VERSION="$(go list -f '{{if .Replace}}{{.Replace.Version}}{{else}}{{.Version}}{{end}}' -m github.com/CosmWasm/wasmvm 2>/dev/null | sed 's/^v//' | sed 's/-.*//')"; \ - [ -n "$WASMVM_VERSION" ] || { echo "wasmvm version not found in go.mod; set --build-arg WASMVM_VERSION=vX.Y.Z"; exit 1; }; \ - WASMVM_VERSION="v${WASMVM_VERSION}"; \ - fi; \ - case "${TARGETARCH:-$(go env GOARCH)}" in \ - amd64) ARCH=x86_64 ;; \ - arm64) ARCH=aarch64 ;; \ - *) echo "unsupported arch: ${TARGETARCH:-$(go env GOARCH)}"; exit 1 ;; \ - esac; \ - wget -O /build/deps/libwasmvm.${ARCH}.so \ - "https://github.com/CosmWasm/wasmvm/releases/download/${WASMVM_VERSION}/libwasmvm.${ARCH}.so"; \ - found=1; \ - fi; \ - ls -l /build/deps - -# ---------- Runtime ---------- -FROM ubuntu:24.04 -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && \ +ARG SEI_CHAIN_REF="" +ARG GO_BUILD_TAGS="" +ARG GO_BUILD_ARGS="" +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + BUILD_TAGS="netgo ledger ${GO_BUILD_TAGS}" && \ + VERSION_PKG="github.com/cosmos/cosmos-sdk/version" && \ + LDFLAGS="\ + -X ${VERSION_PKG}.Name=sei \ + -X ${VERSION_PKG}.AppName=seid \ + -X ${VERSION_PKG}.Version=$(git describe --tags || echo "${SEI_CHAIN_REF}") \ + -X ${VERSION_PKG}.Commit=$(git log -1 --format='%H') \ + -X '${VERSION_PKG}.BuildTags=${BUILD_TAGS}'" && \ + go build -tags "${BUILD_TAGS}" -ldflags "${LDFLAGS}" ${GO_BUILD_ARGS} -o /go/bin/seid ./cmd/seid && \ + go build -tags "${BUILD_TAGS}" -ldflags "${LDFLAGS}" ${GO_BUILD_ARGS} -o /go/bin/price-feeder ./oracle/price-feeder + +FROM docker.io/ubuntu:24.04@sha256:104ae83764a5119017b8e8d6218fa0832b09df65aae7d5a6de29a85d813da2fb + +RUN apt-get update && \ + apt-get install -y --no-install-recommends ca-certificates && \ rm -rf /var/lib/apt/lists/* -COPY --from=go-builder /app/sei-chain/build/seid /bin/seid -COPY --from=go-builder /app/sei-chain/build/price-feeder /bin/price-feeder -COPY --from=go-builder /build/deps/libwasmvm*.so /usr/lib/ - -# Ensure generic symlink exists and refresh linker cache -RUN bash -lc '\ - set -eux; \ - arch=$(uname -m); case "$arch" in x86_64|amd64) a=x86_64 ;; aarch64|arm64) a=aarch64 ;; *) a="" ;; esac; \ - if [ -n "$a" ] && [ -f "/usr/lib/libwasmvm.${a}.so" ]; then ln -sf "/usr/lib/libwasmvm.${a}.so" /usr/lib/libwasmvm.so; fi; \ - ldconfig' +COPY --from=builder /go/bin/seid /go/bin/price-feeder /usr/bin/ +COPY --from=seictl /usr/bin/seictl /usr/bin/ +COPY --from=builder /go/lib/*.so /usr/lib/ -EXPOSE 1317 26656 26657 8545 9090 -ENTRYPOINT ["/bin/seid"] \ No newline at end of file +ENTRYPOINT ["/usr/bin/seid"] \ No newline at end of file diff --git a/app/app.go b/app/app.go index 25a79badd9..d55affd6cf 100644 --- a/app/app.go +++ b/app/app.go @@ -12,6 +12,7 @@ import ( "os" "path/filepath" "regexp" + "runtime/debug" "strings" "sync" "time" @@ -37,6 +38,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/auth/vesting" @@ -104,6 +106,7 @@ import ( "github.com/sei-protocol/sei-chain/app/upgrades" v0upgrade "github.com/sei-protocol/sei-chain/app/upgrades/v0" "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/precompiles" putils "github.com/sei-protocol/sei-chain/precompiles/utils" "github.com/sei-protocol/sei-chain/utils" @@ -345,6 +348,9 @@ type App struct { // mm is the module manager mm *module.Manager + // sm is the simulation manager + sm *module.SimulationManager + configurator module.Configurator optimisticProcessingInfo OptimisticProcessingInfo @@ -366,7 +372,7 @@ type App struct { encodingConfig appparams.EncodingConfig legacyEncodingConfig appparams.EncodingConfig - evmRPCConfig evmrpc.Config + evmRPCConfig evmrpcconfig.Config lightInvarianceConfig LightInvarianceConfig genesisImportConfig genesistypes.GenesisImportConfig @@ -628,7 +634,7 @@ func New( bApp.SetPreCommitHandler(app.HandlePreCommit) bApp.SetCloseHandler(app.HandleClose) - app.evmRPCConfig, err = evmrpc.ReadConfig(appOpts) + app.evmRPCConfig, err = evmrpcconfig.ReadConfig(appOpts) if err != nil { panic(fmt.Sprintf("error reading EVM config due to %s", err)) } @@ -715,7 +721,7 @@ func New( app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.AccountKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, nil), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper), @@ -731,7 +737,7 @@ func New( ibc.NewAppModule(app.IBCKeeper), params.NewAppModule(app.ParamsKeeper), oraclemodule.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), - wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), evm.NewAppModule(appCodec, &app.EvmKeeper), transferModule, epochModule, @@ -810,6 +816,29 @@ func New( app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) + // create the simulation manager and define the order of the modules for deterministic simulations + app.sm = module.NewSimulationManager( + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + params.NewAppModule(app.ParamsKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + oraclemodule.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + ibc.NewAppModule(app.IBCKeeper), + transferModule, + epochModule, + tokenfactorymodule.NewAppModule(app.TokenFactoryKeeper, app.AccountKeeper, app.BankKeeper), + // this line is used by starport scaffolding # stargate/app/appModule + ) + app.sm.RegisterStoreDecoders() + app.RegisterUpgradeHandlers() app.SetStoreUpgradeHandlers() @@ -1371,12 +1400,14 @@ func (app *App) ProcessBlock(ctx sdk.Context, txs [][]byte, req BlockProcessRequ defer func() { if r := recover(); r != nil { panicMsg := fmt.Sprintf("%v", r) + // Re-panic for upgrade-related panics to allow proper upgrade mechanism if upgradePanicRe.MatchString(panicMsg) { ctx.Logger().Error("upgrade panic detected, panicking to trigger upgrade", "panic", r) panic(r) // Re-panic to trigger upgrade mechanism } - ctx.Logger().Error("panic recovered in ProcessBlock", "panic", r) + stack := string(debug.Stack()) + ctx.Logger().Error("panic recovered in ProcessBlock", "panic", r, "stack", stack) err = fmt.Errorf("ProcessBlock panic: %v", r) events = nil txResults = nil @@ -1800,6 +1831,10 @@ func (app *App) checkTotalBlockGas(ctx sdk.Context, txs [][]byte) (result bool) // Returns false only if DEFINITELY not gasless. // False negatives are unacceptable as they cause incorrect gas metrics. func (app *App) couldBeGaslessTransaction(tx sdk.Tx) bool { + if tx == nil { + return false + } + msgs := tx.GetMsgs() if len(msgs) == 0 { // Empty transactions are definitely not gasless @@ -1863,6 +1898,11 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino return paramsKeeper } +// SimulationManager implements the SimulationApp interface +func (app *App) SimulationManager() *module.SimulationManager { + return app.sm +} + func (app *App) BlacklistedAccAddrs() map[string]bool { blacklistedAddrs := make(map[string]bool) for acc := range maccPerms { diff --git a/app/app_test.go b/app/app_test.go index e5980c1d18..529afbe04a 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -797,3 +797,15 @@ func TestProcessBlockUpgradePanicLogic(t *testing.T) { }) } } + +func TestDeliverTxWithNilTypedTxDoesNotPanic(t *testing.T) { + sei := app.Setup(t, false, false, false) + ctx := sei.BaseApp.NewContext(false, types.Header{}) + + malformedTxBytes := []byte("invalid tx bytes that cannot be decoded") + + require.NotPanics(t, func() { + result := sei.DeliverTxWithResult(ctx, malformedTxBytes, nil) + require.NotNil(t, result) + }) +} diff --git a/app/params/config.go b/app/params/config.go index ab7b01e2bf..7223b6270c 100644 --- a/app/params/config.go +++ b/app/params/config.go @@ -3,7 +3,7 @@ package params import ( srvconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/types/address" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" tmcfg "github.com/tendermint/tendermint/config" sdk "github.com/cosmos/cosmos-sdk/types" @@ -195,7 +195,7 @@ func SetAppConfigByMode(config *srvconfig.Config, mode NodeMode) { // SetEVMConfigByMode sets EVM config based on node mode // Validators and seeds have EVM disabled, full nodes and archives have it enabled -func SetEVMConfigByMode(config *evmrpc.Config, mode NodeMode) { +func SetEVMConfigByMode(config *evmrpcconfig.Config, mode NodeMode) { evmEnabled := mode.IsFullnodeType() config.HTTPEnabled = evmEnabled config.WSEnabled = evmEnabled diff --git a/app/params/config_test.go b/app/params/config_test.go index 3b7bdac245..90004bcd77 100644 --- a/app/params/config_test.go +++ b/app/params/config_test.go @@ -3,7 +3,7 @@ package params import ( "testing" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/stretchr/testify/require" ) @@ -43,7 +43,7 @@ func TestSetEVMConfigByMode(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Create default EVM config - evmConfig := evmrpc.DefaultConfig + evmConfig := evmrpcconfig.DefaultConfig // Set EVM config based on mode SetEVMConfigByMode(&evmConfig, tt.mode) diff --git a/app/params/params.go b/app/params/params.go new file mode 100644 index 0000000000..b6aa5fb55e --- /dev/null +++ b/app/params/params.go @@ -0,0 +1,7 @@ +package params + +// Simulation parameter constants +const ( + StakePerAccount = "stake_per_account" + InitiallyBondedValidators = "initially_bonded_validators" +) diff --git a/app/params/weights.go b/app/params/weights.go new file mode 100644 index 0000000000..746e304de2 --- /dev/null +++ b/app/params/weights.go @@ -0,0 +1,28 @@ +package params + +// Default simulation operation weights for messages and gov proposals +const ( + DefaultWeightMsgSend int = 100 + DefaultWeightMsgMultiSend int = 10 + DefaultWeightMsgSetWithdrawAddress int = 50 + DefaultWeightMsgWithdrawDelegationReward int = 50 + DefaultWeightMsgWithdrawValidatorCommission int = 50 + DefaultWeightMsgFundCommunityPool int = 50 + DefaultWeightMsgDeposit int = 100 + DefaultWeightMsgVote int = 67 + DefaultWeightMsgVoteWeighted int = 33 + DefaultWeightMsgUnjail int = 100 + DefaultWeightMsgCreateValidator int = 100 + DefaultWeightMsgEditValidator int = 5 + DefaultWeightMsgDelegate int = 100 + DefaultWeightMsgUndelegate int = 100 + DefaultWeightMsgBeginRedelegate int = 100 + + DefaultWeightCommunitySpendProposal int = 5 + DefaultWeightTextProposal int = 5 + DefaultWeightParamChangeProposal int = 5 + + // feegrant + DefaultWeightGrantAllowance int = 100 + DefaultWeightRevokeAllowance int = 100 +) diff --git a/app/tags b/app/tags index 98c389f26b..6f8326012e 100644 --- a/app/tags +++ b/app/tags @@ -99,3 +99,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/cmd/seid/cmd/app_config.go b/cmd/seid/cmd/app_config.go index caf828ae02..f2ba68622f 100644 --- a/cmd/seid/cmd/app_config.go +++ b/cmd/seid/cmd/app_config.go @@ -3,7 +3,7 @@ package cmd import ( srvconfig "github.com/cosmos/cosmos-sdk/server/config" seiapp "github.com/sei-protocol/sei-chain/app" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/x/evm/blocktest" "github.com/sei-protocol/sei-chain/x/evm/querier" "github.com/sei-protocol/sei-chain/x/evm/replay" @@ -24,7 +24,7 @@ type CustomAppConfig struct { StateCommit seidbconfig.StateCommitConfig `mapstructure:"state-commit"` StateStore seidbconfig.StateStoreConfig `mapstructure:"state-store"` WASM WASMConfig `mapstructure:"wasm"` - EVM evmrpc.Config `mapstructure:"evm"` + EVM evmrpcconfig.Config `mapstructure:"evm"` ETHReplay replay.Config `mapstructure:"eth_replay"` ETHBlockTest blocktest.Config `mapstructure:"eth_block_test"` EvmQuery querier.Config `mapstructure:"evm_query"` @@ -32,7 +32,7 @@ type CustomAppConfig struct { } // NewCustomAppConfig creates a CustomAppConfig with the given base config and EVM config -func NewCustomAppConfig(baseConfig *srvconfig.Config, evmConfig evmrpc.Config) CustomAppConfig { +func NewCustomAppConfig(baseConfig *srvconfig.Config, evmConfig evmrpcconfig.Config) CustomAppConfig { return CustomAppConfig{ Config: *baseConfig, StateCommit: seidbconfig.DefaultStateCommitConfig(), diff --git a/cmd/seid/cmd/init.go b/cmd/seid/cmd/init.go index f86a5e92a0..5060429467 100644 --- a/cmd/seid/cmd/init.go +++ b/cmd/seid/cmd/init.go @@ -24,7 +24,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" ) const ( @@ -189,7 +189,7 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command { params.SetAppConfigByMode(appConfig, nodeMode) // Configure EVM based on node mode - evmConfig := evmrpc.DefaultConfig + evmConfig := evmrpcconfig.DefaultConfig params.SetEVMConfigByMode(&evmConfig, nodeMode) appTomlPath := filepath.Join(configPath, "app.toml") diff --git a/cmd/seid/cmd/init_test.go b/cmd/seid/cmd/init_test.go index 4cf19b147b..9c9e95aae0 100644 --- a/cmd/seid/cmd/init_test.go +++ b/cmd/seid/cmd/init_test.go @@ -8,7 +8,7 @@ import ( srvconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/sei-protocol/sei-chain/app/params" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" seidbconfig "github.com/sei-protocol/sei-db/config" "github.com/spf13/viper" "github.com/stretchr/testify/require" @@ -133,7 +133,7 @@ func TestInitModeConfiguration(t *testing.T) { // Write app.toml using our custom template that includes SeiDB configs // This mirrors what initAppConfig does in root.go appTomlPath := filepath.Join(configDir, "app.toml") - customConfig := NewCustomAppConfig(appConfig, evmrpc.DefaultConfig) + customConfig := NewCustomAppConfig(appConfig, evmrpcconfig.DefaultConfig) // Apply mode-specific StateStore settings if tt.mode == params.NodeModeValidator || tt.mode == params.NodeModeSeed { @@ -223,7 +223,7 @@ func TestModeConfigurationMatrix(t *testing.T) { require.Equal(t, expected.apiEnable, appConfig.API.Enable) // Verify EVM config - evmConfig := evmrpc.DefaultConfig + evmConfig := evmrpcconfig.DefaultConfig params.SetEVMConfigByMode(&evmConfig, mode) require.Equal(t, expected.evmEnable, evmConfig.HTTPEnabled) require.Equal(t, expected.evmEnable, evmConfig.WSEnabled) diff --git a/cmd/seid/cmd/root.go b/cmd/seid/cmd/root.go index 5841b4e3ba..9cc22b0c47 100644 --- a/cmd/seid/cmd/root.go +++ b/cmd/seid/cmd/root.go @@ -35,7 +35,7 @@ import ( genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/sei-protocol/sei-chain/app" "github.com/sei-protocol/sei-chain/app/params" - "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/tools" "github.com/sei-protocol/sei-chain/tools/migration/ss" seidbconfig "github.com/sei-protocol/sei-db/config" @@ -433,12 +433,12 @@ func initAppConfig() (string, interface{}) { srvCfg.Telemetry.PrometheusRetentionTime = 60 // Use shared CustomAppConfig from app_config.go - customAppConfig := NewCustomAppConfig(srvCfg, evmrpc.DefaultConfig) + customAppConfig := NewCustomAppConfig(srvCfg, evmrpcconfig.DefaultConfig) customAppTemplate := serverconfig.ManualConfigTemplate + seidbconfig.StateCommitConfigTemplate + seidbconfig.StateStoreConfigTemplate + - evmrpc.ConfigTemplate + + evmrpcconfig.ConfigTemplate + serverconfig.AutoManagedConfigTemplate + ` ############################################################################### ### WASM Configuration (Auto-managed) ### diff --git a/contracts/src/SstoreGasTest.sol b/contracts/src/SstoreGasTest.sol new file mode 100644 index 0000000000..848b63d589 --- /dev/null +++ b/contracts/src/SstoreGasTest.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title SstoreGasTest + * @notice Contract to test SSTORE gas accounting differences between receipts and debug traces + * @dev This contract performs cold SSTORE operations to reproduce the gas discrepancy issue + */ +contract SstoreGasTest { + // Storage slots that will be written to (cold SSTORE) + uint256 public slot0; + uint256 public slot1; + uint256 public slot2; + uint256 public slot3; + uint256 public slot4; + + // Mapping for additional cold storage writes + mapping(uint256 => uint256) public data; + + event StorageWritten(uint256 indexed count, uint256 gasUsed); + + /** + * @notice Performs a single cold SSTORE operation + * @param value The value to store + */ + function singleColdSstore(uint256 value) external { + uint256 gasBefore = gasleft(); + slot0 = value; + uint256 gasAfter = gasleft(); + emit StorageWritten(1, gasBefore - gasAfter); + } + + /** + * @notice Performs multiple cold SSTORE operations + * @param value The base value to store + */ + function multipleColdSstores(uint256 value) external { + uint256 gasBefore = gasleft(); + slot0 = value; + slot1 = value + 1; + slot2 = value + 2; + slot3 = value + 3; + slot4 = value + 4; + uint256 gasAfter = gasleft(); + emit StorageWritten(5, gasBefore - gasAfter); + } + + /** + * @notice Performs cold SSTORE to mapping slots + * @param count Number of mapping entries to write + * @param baseValue Base value to store + */ + function coldSstoreMapping(uint256 count, uint256 baseValue) external { + uint256 gasBefore = gasleft(); + for (uint256 i = 0; i < count; i++) { + data[i] = baseValue + i; + } + uint256 gasAfter = gasleft(); + emit StorageWritten(count, gasBefore - gasAfter); + } + + /** + * @notice Performs warm SSTORE (re-writing to same slot) + * @param value The value to store + */ + function warmSstore(uint256 value) external { + // First write (cold) + slot0 = value; + // Second write to same slot (warm) + slot0 = value + 1; + } + + /** + * @notice Mixed cold and warm SSTOREs + * @param value The value to store + */ + function mixedSstores(uint256 value) external { + // Cold writes + slot0 = value; + slot1 = value + 1; + // Warm writes (same slots) + slot0 = value + 10; + slot1 = value + 11; + // More cold writes + slot2 = value + 2; + } + + /** + * @notice Reset all slots to zero (for testing clean state) + */ + function resetSlots() external { + slot0 = 0; + slot1 = 0; + slot2 = 0; + slot3 = 0; + slot4 = 0; + } + + /** + * @notice Get current slot values + */ + function getSlots() external view returns (uint256, uint256, uint256, uint256, uint256) { + return (slot0, slot1, slot2, slot3, slot4); + } +} + diff --git a/contracts/test/EVMCompatabilityTest.js b/contracts/test/EVMCompatabilityTest.js index 03ced0f634..637be1cd9a 100644 --- a/contracts/test/EVMCompatabilityTest.js +++ b/contracts/test/EVMCompatabilityTest.js @@ -1395,6 +1395,281 @@ describe("EVM Validations ", function() { }) +describe("SSTORE Gas Discrepancy Test", function() { + let sstoreTest; + let owner; + + before(async function() { + const accounts = await setupSigners(await hre.ethers.getSigners()); + owner = accounts[0].signer; + + // Deploy SstoreGasTest contract + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + sstoreTest = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await sstoreTest.waitForDeployment(); + }); + + // Helper to calculate total gas from flatCallTracer result (matches Go auditor logic) + function calculateTotalGasUsed(traceResult) { + // For callTracer, gasUsed is in the top-level result + // The result could be a single object or the gasUsed field directly + if (typeof traceResult === 'object' && traceResult.gasUsed !== undefined) { + // gasUsed is hex string like "0x5208" + if (typeof traceResult.gasUsed === 'string' && traceResult.gasUsed.startsWith('0x')) { + return parseInt(traceResult.gasUsed, 16); + } + return Number(traceResult.gasUsed); + } + return 0; + } + + // Matches Go auditor: uses callTracer and compares gasUsed from trace result vs receipt + async function compareReceiptAndTraceGas(txHash) { + // Get receipt gas used (same as Go: receipt.GasUsed) + const receipt = await ethers.provider.getTransactionReceipt(txHash); + const receiptGasUsed = Number(receipt.gasUsed); + + // Get trace with callTracer (similar to Go auditor's flatCallTracer) + const trace = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [txHash, { tracer: "callTracer" }], + }); + + // Calculate gas from trace result (same as Go: calculateTotalGasUsed(trace.Result)) + const traceGasUsed = calculateTotalGasUsed(trace); + + // Also get default tracer for comparison + const defaultTrace = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [txHash], + }); + + return { + receiptGasUsed, + traceGasUsed, + defaultTraceGas: defaultTrace.gas, + difference: receiptGasUsed - traceGasUsed, + receipt, + trace, + defaultTrace + }; + } + + it("should have matching gas between receipt and trace for single cold SSTORE", async function() { + // Reset slots first to ensure cold storage + const resetTx = await sstoreTest.resetSlots({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await resetTx.wait(); + + // Deploy a fresh contract to ensure truly cold storage + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const freshContract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await freshContract.waitForDeployment(); + + // Perform single cold SSTORE + const tx = await freshContract.singleColdSstore(12345, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const txReceipt = await tx.wait(); + + const result = await compareReceiptAndTraceGas(txReceipt.hash); + + expect(result.difference).to.equal(0, + `Gas mismatch: receipt=${result.receiptGasUsed}, trace=${result.traceGasUsed}, diff=${result.difference}`); + }); + + it("should have matching gas between receipt and trace for multiple cold SSTOREs", async function() { + // Deploy a fresh contract to ensure truly cold storage + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const freshContract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await freshContract.waitForDeployment(); + + // Perform multiple cold SSTOREs (5 slots) + const tx = await freshContract.multipleColdSstores(100, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const txReceipt = await tx.wait(); + + const result = await compareReceiptAndTraceGas(txReceipt.hash); + + expect(result.difference).to.equal(0, + `Gas mismatch: receipt=${result.receiptGasUsed}, trace=${result.traceGasUsed}, diff=${result.difference}`); + }); + + it("should have matching gas for mapping cold SSTOREs", async function() { + // Deploy a fresh contract + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const freshContract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await freshContract.waitForDeployment(); + + // Perform cold SSTOREs to 3 mapping slots + const tx = await freshContract.coldSstoreMapping(3, 500, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const txReceipt = await tx.wait(); + + const result = await compareReceiptAndTraceGas(txReceipt.hash); + + expect(result.difference).to.equal(0, + `Gas mismatch: receipt=${result.receiptGasUsed}, trace=${result.traceGasUsed}, diff=${result.difference}`); + }); + + it("should analyze SSTORE opcodes in trace", async function() { + // Deploy a fresh contract + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const freshContract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await freshContract.waitForDeployment(); + + // Perform single cold SSTORE + const tx = await freshContract.singleColdSstore(99999, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const txReceipt = await tx.wait(); + + // Get detailed trace + const trace = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [txReceipt.hash], + }); + + // Find SSTORE operations and their gas costs + const sstoreOps = []; + for (let i = 0; i < trace.structLogs.length; i++) { + const log = trace.structLogs[i]; + if (log.op === "SSTORE") { + const gasBefore = i > 0 ? trace.structLogs[i-1].gas : trace.structLogs[0].gas; + const gasAfter = log.gas; + const gasCost = gasBefore - gasAfter; + sstoreOps.push({ + index: i, + gasCost: gasCost, + depth: log.depth, + gas: log.gas, + gasCostField: log.gasCost + }); + } + } + + // Verify we found at least one SSTORE + expect(sstoreOps.length).to.be.greaterThan(0, "Should find at least one SSTORE operation"); + }); + + it("should compare gas with callTracer (matches Go auditor)", async function() { + // Deploy a fresh contract + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const freshContract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await freshContract.waitForDeployment(); + + const tx = await freshContract.multipleColdSstores(200, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const txReceipt = await tx.wait(); + + // Get receipt gas (same as Go: receipt.GasUsed) + const receiptGasUsed = Number(txReceipt.gasUsed); + const receiptStatus = txReceipt.status; + + // Get trace with callTracer (similar to Go auditor) + const callTrace = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [txReceipt.hash, { tracer: "callTracer" }], + }); + + // Parse gasUsed from trace (same as Go: calculateTotalGasUsed(trace.Result)) + const callTracerGas = parseInt(callTrace.gasUsed, 16); + const difference = receiptGasUsed - callTracerGas; + + // This matches Go auditor's check for successful transactions + if (receiptStatus !== 0) { + expect(difference).to.equal(0, + `Gas mismatch: receipt=${receiptGasUsed}, trace=${callTracerGas}, diff=${difference}`); + } + }); + + it("should reproduce mismatch by changing param between execution and trace", async function() { + this.timeout(120000); // 2 minutes for governance proposals + + const { proposeParamChange, passProposal } = require("./lib.js"); + + // 1. First, ensure param is set to a known high value (72000) + try { + const proposalId1 = await proposeParamChange( + "Set SSTORE high", + "Set to 72k for test", + [{ + subspace: "evm", + key: "KeySeiSstoreSetGasEIP2200", + value: "72000" + }] + ); + await passProposal(proposalId1); + } catch (e) { + // May already be set + } + + // 2. Deploy and execute tx - receipt records gas with current SSTORE value + const SstoreGasTest = await ethers.getContractFactory("SstoreGasTest"); + const contract = await SstoreGasTest.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await contract.waitForDeployment(); + + const tx = await contract.singleColdSstore(12345, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const receipt = await tx.wait(); + const receiptGasUsed = Number(receipt.gasUsed); + + // 3. Change param to 1 (simulating the bug condition - can't use 0 as it may be rejected) + const proposalId2 = await proposeParamChange( + "Set SSTORE low", + "Set to 1 to reproduce bug", + [{ + subspace: "evm", + key: "KeySeiSstoreSetGasEIP2200", + value: "1" + }] + ); + await passProposal(proposalId2); + + // 4. Now trace the FIRST transaction (executed with SSTORE=72k) - tracer should use historical value + const trace = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [receipt.hash, { tracer: "callTracer" }], + }); + const traceGasUsed = parseInt(trace.gasUsed, 16); + + // 5. Compare results for first transaction + const difference = receiptGasUsed - traceGasUsed; + + // 6. Execute SECOND transaction while SSTORE=1 + const SstoreGasTest2 = await ethers.getContractFactory("SstoreGasTest"); + const contract2 = await SstoreGasTest2.deploy({ gasPrice: ethers.parseUnits('100', 'gwei') }); + await contract2.waitForDeployment(); + + const tx2 = await contract2.singleColdSstore(99999, { gasPrice: ethers.parseUnits('100', 'gwei') }); + const receipt2 = await tx2.wait(); + const receipt2GasUsed = Number(receipt2.gasUsed); + + // 7. Restore param to 72000 + try { + const proposalId3 = await proposeParamChange( + "Restore SSTORE", + "Restore to 72k", + [{ + subspace: "evm", + key: "KeySeiSstoreSetGasEIP2200", + value: "72000" + }] + ); + await passProposal(proposalId3); + } catch (e) { + // Ignore restore failures + } + + // 8. Trace the SECOND transaction (executed with SSTORE=1) - should use historical value + const trace2 = await hre.network.provider.request({ + method: "debug_traceTransaction", + params: [receipt2.hash, { tracer: "callTracer" }], + }); + const trace2GasUsed = parseInt(trace2.gasUsed, 16); + + // 9. Compare results for second transaction + const difference2 = receipt2GasUsed - trace2GasUsed; + + // Test should FAIL if there's any mismatch + expect(difference).to.equal(0, + `First TX gas mismatch! Receipt: ${receiptGasUsed}, Trace: ${traceGasUsed}, Difference: ${difference}`); + expect(difference2).to.equal(0, + `Second TX gas mismatch! Receipt: ${receipt2GasUsed}, Trace: ${trace2GasUsed}, Difference: ${difference2}. Tracer is not using height-aware SSTORE param.`); + }); +}); + describe("EVM throughput", function(){ let accounts; before(async function(){ diff --git a/evmrpc/config.go b/evmrpc/config/config.go similarity index 93% rename from evmrpc/config.go rename to evmrpc/config/config.go index 6823d7f514..989be48fa4 100644 --- a/evmrpc/config.go +++ b/evmrpc/config/config.go @@ -1,4 +1,4 @@ -package evmrpc +package config import ( "runtime" @@ -9,6 +9,29 @@ import ( "github.com/spf13/cast" ) +const ( + // WorkerBatchSize is the number of blocks processed in each batch. + // Used in filter.go for batch processing of block queries. + WorkerBatchSize = 100 + + // DefaultWorkerQueueSize is the default size of the task queue. + // This represents the number of tasks (not blocks) that can be queued. + // Total capacity = DefaultWorkerQueueSize * WorkerBatchSize blocks + // Example: 1000 tasks * 100 blocks/task = 100,000 blocks can be buffered + // + // Memory footprint estimate: + // - Queue channel overhead: ~8KB (1000 * 8 bytes per channel slot) + // - Each task closure: ~24 bytes + // - Total queue memory: ~32KB (negligible) + // Note: Actual memory usage depends on block data processed by workers + DefaultWorkerQueueSize = 1000 + + // MaxWorkerPoolSize caps the number of workers to prevent excessive + // goroutine creation on high-core machines. Tasks are primarily I/O bound + // (fetching and processing block logs), so 2x CPU cores can be excessive. + MaxWorkerPoolSize = 64 +) + // EVMRPC Config defines configurations for EVM RPC server on this node type Config struct { // controls whether an HTTP EVM server is enabled diff --git a/evmrpc/config_test.go b/evmrpc/config/config_test.go similarity index 87% rename from evmrpc/config_test.go rename to evmrpc/config/config_test.go index 8f9671ba69..11e65ca7d3 100644 --- a/evmrpc/config_test.go +++ b/evmrpc/config/config_test.go @@ -1,10 +1,10 @@ -package evmrpc_test +package config_test import ( "testing" "time" - "github.com/sei-protocol/sei-chain/evmrpc" + "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/stretchr/testify/require" ) @@ -168,108 +168,108 @@ func getDefaultOpts() opts { func TestReadConfig(t *testing.T) { goodOpts := getDefaultOpts() - _, err := evmrpc.ReadConfig(&goodOpts) + _, err := config.ReadConfig(&goodOpts) require.Nil(t, err) badOpts := goodOpts badOpts.httpEnabled = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.httpPort = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.wsEnabled = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.wsPort = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.readTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.readHeaderTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.writeTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.idleTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.filterTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.simulationGasLimit = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.simulationEVMTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.corsOrigins = map[string]interface{}{} - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.wsOrigins = map[string]interface{}{} - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.checkTxTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.maxTxPoolTxs = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.slow = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.denyList = map[string]interface{}{} - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) // Test bad types for new trace config options badOpts = goodOpts badOpts.maxConcurrentTraceCalls = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) // Test bad types for new trace config options badOpts = goodOpts badOpts.maxConcurrentSimulationCalls = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.maxTraceLookbackBlocks = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.traceTimeout = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) // Test bad types for worker pool config badOpts = goodOpts badOpts.workerPoolSize = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) badOpts = goodOpts badOpts.workerQueueSize = "bad" - _, err = evmrpc.ReadConfig(&badOpts) + _, err = config.ReadConfig(&badOpts) require.NotNil(t, err) } @@ -319,7 +319,7 @@ func TestReadConfigWorkerPool(t *testing.T) { opts.workerPoolSize = tt.workerPoolSize opts.workerQueueSize = tt.workerQueueSize - cfg, err := evmrpc.ReadConfig(&opts) + cfg, err := config.ReadConfig(&opts) require.Nil(t, err) require.Equal(t, tt.expectedWorkers, cfg.WorkerPoolSize, diff --git a/evmrpc/config_integration_test.go b/evmrpc/config_integration_test.go index 5eb60097c7..5214e90bb6 100644 --- a/evmrpc/config_integration_test.go +++ b/evmrpc/config_integration_test.go @@ -10,6 +10,7 @@ import ( "time" "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/spf13/viper" "github.com/stretchr/testify/require" ) @@ -100,7 +101,7 @@ http_port = 8545 require.NoError(t, err, "Failed to read config file") // Step 3: Read EVM config - cfg, err := evmrpc.ReadConfig(v) + cfg, err := evmrpcconfig.ReadConfig(v) require.NoError(t, err, "Failed to read EVM config") // Step 4: Create a new worker pool with the config (not global) @@ -113,7 +114,7 @@ http_port = 8545 workerCount = runtime.NumCPU() * 2 } if queueSize <= 0 { - queueSize = evmrpc.DefaultWorkerQueueSize + queueSize = evmrpcconfig.DefaultWorkerQueueSize } wp := evmrpc.NewWorkerPool(workerCount, queueSize) @@ -210,7 +211,7 @@ simulation_gas_limit = 10000000 require.NoError(t, err) // Should successfully read config with defaults - cfg, err := evmrpc.ReadConfig(v) + cfg, err := evmrpcconfig.ReadConfig(v) require.NoError(t, err) // Old config should use default calculated values: min(MaxWorkerPoolSize, runtime.NumCPU() * 2) @@ -224,7 +225,7 @@ simulation_gas_limit = 10000000 } queueSize := cfg.WorkerQueueSize if queueSize <= 0 { - queueSize = evmrpc.DefaultWorkerQueueSize + queueSize = evmrpcconfig.DefaultWorkerQueueSize } wp := evmrpc.NewWorkerPool(workerCount, queueSize) @@ -233,7 +234,7 @@ simulation_gas_limit = 10000000 // Verify defaults are applied require.Greater(t, wp.WorkerCount(), 0, "Should apply default worker count") - require.Equal(t, evmrpc.DefaultWorkerQueueSize, wp.QueueSize(), + require.Equal(t, evmrpcconfig.DefaultWorkerQueueSize, wp.QueueSize(), "Should apply default queue size") }) @@ -262,7 +263,7 @@ worker_queue_size = 1000 err = v.ReadInConfig() require.NoError(t, err) - cfg, err := evmrpc.ReadConfig(v) + cfg, err := evmrpcconfig.ReadConfig(v) require.NoError(t, err) // Should read custom values diff --git a/evmrpc/filter.go b/evmrpc/filter.go index 8c12f9972d..9daa35a2a2 100644 --- a/evmrpc/filter.go +++ b/evmrpc/filter.go @@ -17,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/eth/filters" ethrpc "github.com/ethereum/go-ethereum/rpc" "github.com/hashicorp/golang-lru/v2/expirable" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/utils/metrics" "github.com/sei-protocol/sei-chain/x/evm/keeper" evmtypes "github.com/sei-protocol/sei-chain/x/evm/types" @@ -530,7 +531,8 @@ func (a *FilterAPI) GetFilterLogs( } func (a *FilterAPI) GetLogs(ctx context.Context, crit filters.FilterCriteria) (res []*ethtypes.Log, err error) { - defer recordMetricsWithError(fmt.Sprintf("%s_getLogs", a.namespace), a.connectionType, time.Now(), err) + startTime := time.Now() + defer recordMetricsWithError(fmt.Sprintf("%s_getLogs", a.namespace), a.connectionType, startTime, err) latest, err := a.logFetcher.latestHeight(ctx) if err != nil { @@ -548,16 +550,43 @@ func (a *FilterAPI) GetLogs(ctx context.Context, crit filters.FilterCriteria) (r blockRange := end - begin + 1 + // Record metrics for eth_getLogs + defer func() { + GetGlobalMetrics().RecordGetLogsRequest(blockRange, time.Since(startTime), startTime, err) + }() + // Use config value instead of hardcoded constant if blockRange > a.filterConfig.maxBlock { return nil, fmt.Errorf("block range too large (%d), maximum allowed is %d blocks", blockRange, a.filterConfig.maxBlock) } + // Early rejection for pruned blocks - avoid wasting resources on blocks that don't exist + if earliest > 0 && begin < earliest { + return nil, fmt.Errorf("requested block range [%d, %d] includes pruned blocks, earliest available block is %d", begin, end, earliest) + } + // Only apply rate limiting for large queries (> RPSLimitThreshold blocks) if blockRange > RPSLimitThreshold && !a.globalRPSLimiter.Allow() { return nil, fmt.Errorf("log query rate limit exceeded for large queries, please try again later") } + // Backpressure: early rejection based on system load + m := GetGlobalMetrics() + + // Check 1: Too many pending tasks (queue backlog) + pending := m.TasksSubmitted.Load() - m.TasksCompleted.Load() + maxPending := int64(float64(m.QueueCapacity.Load()) * 0.8) // 80% threshold + if pending > maxPending { + return nil, fmt.Errorf("server too busy, rejecting new request (pending: %d, threshold: %d)", pending, maxPending) + } + + // Check 2: I/O saturated (semaphore exhausted) + semInUse := m.DBSemaphoreAcquired.Load() + semCapacity := m.DBSemaphoreCapacity.Load() + if semCapacity > 0 && float64(semInUse)/float64(semCapacity) >= 0.8 { + return nil, fmt.Errorf("server I/O saturated, rejecting new request (semaphore: %d/%d in use)", semInUse, semCapacity) + } + logs, _, err := a.logFetcher.GetLogsByFilters(ctx, crit, 0) if err != nil { return nil, err @@ -772,20 +801,20 @@ func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCr } // Batch process with fail-fast - blockBatch := make([]*coretypes.ResultBlock, 0, WorkerBatchSize) + blockBatch := make([]*coretypes.ResultBlock, 0, evmrpcconfig.WorkerBatchSize) for block := range blocks { blockBatch = append(blockBatch, block) - if len(blockBatch) >= WorkerBatchSize { + if len(blockBatch) >= evmrpcconfig.WorkerBatchSize { batch := blockBatch wg.Add(1) - if err := runner.Submit(func() { processBatch(batch) }); err != nil { + if err := runner.SubmitWithMetrics(func() { processBatch(batch) }); err != nil { wg.Done() submitError = fmt.Errorf("system overloaded, please reduce request frequency: %w", err) break } - blockBatch = make([]*coretypes.ResultBlock, 0, WorkerBatchSize) + blockBatch = make([]*coretypes.ResultBlock, 0, evmrpcconfig.WorkerBatchSize) } } @@ -796,7 +825,7 @@ func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCr // Process remaining blocks if len(blockBatch) > 0 { wg.Add(1) - if err := runner.Submit(func() { processBatch(blockBatch) }); err != nil { + if err := runner.SubmitWithMetrics(func() { processBatch(blockBatch) }); err != nil { wg.Done() return nil, 0, fmt.Errorf("system overloaded, please reduce request frequency: %w", err) } @@ -1003,14 +1032,14 @@ func (f *LogFetcher) fetchBlocksByCrit(ctx context.Context, crit filters.FilterC var wg sync.WaitGroup // Batch processing with fail-fast - for batchStart := begin; batchStart <= end; batchStart += int64(WorkerBatchSize) { - batchEnd := batchStart + int64(WorkerBatchSize) - 1 + for batchStart := begin; batchStart <= end; batchStart += int64(evmrpcconfig.WorkerBatchSize) { + batchEnd := batchStart + int64(evmrpcconfig.WorkerBatchSize) - 1 if batchEnd > end { batchEnd = end } wg.Add(1) - if err := runner.Submit(func(start, endHeight int64) func() { + if err := runner.SubmitWithMetrics(func(start, endHeight int64) func() { return func() { defer wg.Done() f.processBatch(ctx, start, endHeight, crit, bloomIndexes, res, errChan) @@ -1047,6 +1076,9 @@ func (f *LogFetcher) processBatch(ctx context.Context, start, end int64, crit fi defer func() { metrics.IncrementRpcRequestCounter("num_blocks_fetched", "blocks", true) }() + + wpMetrics := GetGlobalMetrics() + for height := start; height <= end; height++ { if height == 0 { continue @@ -1064,11 +1096,15 @@ func (f *LogFetcher) processBatch(ctx context.Context, start, end int64, crit fi } // Block cache miss, acquire semaphore for I/O operations + semWaitStart := time.Now() f.dbReadSemaphore <- struct{}{} + wpMetrics.RecordDBSemaphoreWait(time.Since(semWaitStart)) + wpMetrics.RecordDBSemaphoreAcquire() // Re-check cache after acquiring semaphore, in case another worker cached it. if cachedEntry, found := f.globalBlockCache.Get(height); found { <-f.dbReadSemaphore + wpMetrics.RecordDBSemaphoreRelease() if cachedEntry.Block != nil { if err := f.watermarks.EnsureBlockHeightAvailable(ctx, cachedEntry.Block.Block.Height); err != nil { continue @@ -1093,6 +1129,7 @@ func (f *LogFetcher) processBatch(ctx context.Context, start, end int64, crit fi // skip the bloom pre-filter instead of short-circuiting the block. if blockBloom != (ethtypes.Bloom{}) && !MatchFilters(blockBloom, bloomIndexes) { <-f.dbReadSemaphore + wpMetrics.RecordDBSemaphoreRelease() continue // skip the block if bloom filter does not match } } @@ -1105,6 +1142,7 @@ func (f *LogFetcher) processBatch(ctx context.Context, start, end int64, crit fi default: } <-f.dbReadSemaphore + wpMetrics.RecordDBSemaphoreRelease() continue } @@ -1115,6 +1153,7 @@ func (f *LogFetcher) processBatch(ctx context.Context, start, end int64, crit fi fillMissingFields(entry, block, blockBloom) } <-f.dbReadSemaphore + wpMetrics.RecordDBSemaphoreRelease() res <- block } } diff --git a/evmrpc/rpcstack.go b/evmrpc/rpcstack.go index 6ca0bc73f7..e438faba6c 100644 --- a/evmrpc/rpcstack.go +++ b/evmrpc/rpcstack.go @@ -93,7 +93,8 @@ type HTTPServer struct { } const ( - shutdownTimeout = 5 * time.Second + shutdownTimeout = 5 * time.Second + metricsPrinterInterval = 5 * time.Second ) func NewHTTPServer(log log.Logger, timeouts rpc.HTTPTimeouts) *HTTPServer { @@ -184,6 +185,10 @@ func (h *HTTPServer) Start() error { "vhosts", strings.Join(h.HTTPConfig.Vhosts, ","), ) + // Start metrics printer + // Prometheus metrics are always exported; stdout printing requires EVM_DEBUG_METRICS=true + StartMetricsPrinter(metricsPrinterInterval) + // Log all handlers mounted on server. paths := make([]string, len(h.handlerNames)) for path := range h.handlerNames { @@ -256,6 +261,9 @@ func (h *HTTPServer) doStop() { return // not running } + // Stop metrics printer + StopMetricsPrinter() + // Shut down the server. httpHandler := h.httpHandler.Load().(*rpcHandler) wsHandler := h.wsHandler.Load().(*rpcHandler) diff --git a/evmrpc/server.go b/evmrpc/server.go index c3d96b0f7a..7492832647 100644 --- a/evmrpc/server.go +++ b/evmrpc/server.go @@ -5,12 +5,14 @@ import ( "strings" "sync" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rpc" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rpc" "github.com/sei-protocol/sei-chain/app/legacyabci" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/evmrpc/stats" evmCfg "github.com/sei-protocol/sei-chain/x/evm/config" "github.com/sei-protocol/sei-chain/x/evm/keeper" @@ -34,7 +36,7 @@ type EVMServer interface { func NewEVMHTTPServer( logger log.Logger, - config Config, + config evmrpcconfig.Config, tmClient rpcclient.Client, k *keeper.Keeper, beginBlockKeepers legacyabci.BeginBlockKeepers, @@ -48,9 +50,24 @@ func NewEVMHTTPServer( ) (EVMServer, error) { logger = logger.With("module", "evmrpc") - // Initialize global worker pool with configuration + // Initialize global worker pool with configuration (metrics are embedded in pool) InitGlobalWorkerPool(config.WorkerPoolSize, config.WorkerQueueSize) + // Get pool for logging and DB semaphore setup + pool := GetGlobalWorkerPool() + workerCount := pool.WorkerCount() + queueSize := pool.QueueSize() + + // Set DB semaphore capacity in metrics (aligned with worker count) + // Only set once to avoid races when multiple test servers start in parallel. + pool.Metrics.DBSemaphoreCapacity.CompareAndSwap(0, int32(workerCount)) //nolint:gosec // G115: safe, max is 64 + + debugEnabled := IsDebugMetricsEnabled() + logger.Info("Started EVM RPC metrics exporter (interval: 5s)", "workers", workerCount, "queue", queueSize, "db_semaphore", workerCount, "debug_stdout", debugEnabled) + if !debugEnabled { + logger.Info("To enable debug metrics output to stdout, set EVM_DEBUG_METRICS=true") + } + // Initialize RPC tracker stats.InitRPCTracker(ctxProvider(LatestCtxHeight).Context(), logger, config.RPCStatsInterval) @@ -85,7 +102,8 @@ func NewEVMHTTPServer( seiTxAPI := NewSeiTransactionAPI(tmClient, k, ctxProvider, txConfigProvider, homeDir, ConnectionTypeHTTP, isPanicOrSyntheticTxFunc, watermarks, globalBlockCache, cacheCreationMutex) seiDebugAPI := NewSeiDebugAPI(tmClient, k, beginBlockKeepers, ctxProvider, txConfigProvider, simulateConfig, app, antehandler, ConnectionTypeHTTP, config, globalBlockCache, cacheCreationMutex, watermarks) - dbReadSemaphore := make(chan struct{}, MaxDBReadConcurrency) + // DB semaphore aligned with worker count + dbReadSemaphore := make(chan struct{}, workerCount) globalLogSlicePool := NewLogSlicePool() apis := []rpc.API{ { @@ -211,7 +229,7 @@ func NewEVMHTTPServer( func NewEVMWebSocketServer( logger log.Logger, - config Config, + config evmrpcconfig.Config, tmClient rpcclient.Client, k *keeper.Keeper, beginBlockKeepers legacyabci.BeginBlockKeepers, @@ -224,7 +242,8 @@ func NewEVMWebSocketServer( ) (EVMServer, error) { logger = logger.With("module", "evmrpc") - // Initialize global worker pool with configuration + // Initialize global worker pool with configuration (metrics are embedded in pool) + // This is idempotent - if HTTP server already initialized it, this is a no-op InitGlobalWorkerPool(config.WorkerPoolSize, config.WorkerQueueSize) // Initialize WebSocket tracker. @@ -245,7 +264,8 @@ func NewEVMWebSocketServer( MaxConcurrentSimulationCalls: config.MaxConcurrentSimulationCalls, } watermarks := NewWatermarkManager(tmClient, ctxProvider, stateStore, k.ReceiptStore()) - dbReadSemaphore := make(chan struct{}, MaxDBReadConcurrency) + // DB semaphore aligned with worker count + dbReadSemaphore := make(chan struct{}, GetGlobalWorkerPool().WorkerCount()) globalBlockCache := NewBlockCache(3000) cacheCreationMutex := &sync.Mutex{} globalLogSlicePool := NewLogSlicePool() diff --git a/evmrpc/setup_test.go b/evmrpc/setup_test.go index 92b3f5c818..9f0f556d60 100644 --- a/evmrpc/setup_test.go +++ b/evmrpc/setup_test.go @@ -26,6 +26,7 @@ import ( "github.com/gorilla/websocket" "github.com/sei-protocol/sei-chain/app" "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/sei-protocol/sei-chain/utils" "github.com/sei-protocol/sei-chain/x/evm/config" @@ -588,7 +589,7 @@ func init() { return Ctx.WithIsTracing(true) } // Start good http server - goodConfig := evmrpc.DefaultConfig + goodConfig := evmrpcconfig.DefaultConfig goodConfig.HTTPPort = TestPort goodConfig.WSPort = TestWSPort goodConfig.FilterTimeout = 500 * time.Millisecond @@ -607,7 +608,7 @@ func init() { } // Start bad http server - badConfig := evmrpc.DefaultConfig + badConfig := evmrpcconfig.DefaultConfig badConfig.HTTPPort = TestBadPort badConfig.FilterTimeout = 500 * time.Millisecond badHTTPServer, err := evmrpc.NewEVMHTTPServer(infoLog, badConfig, &MockBadClient{}, EVMKeeper, testApp.BeginBlockKeepers, testApp.BaseApp, testApp.TracerAnteHandler, ctxProvider, txConfigProvider, "", testApp.GetStateStore(), nil) diff --git a/evmrpc/simulate.go b/evmrpc/simulate.go index 341113aa66..3de089ebf8 100644 --- a/evmrpc/simulate.go +++ b/evmrpc/simulate.go @@ -412,8 +412,7 @@ func (b *Backend) RPCEVMTimeout() time.Duration { return b.config.EVMTimeout } func (b *Backend) chainConfigForHeight(height int64) *params.ChainConfig { ctx := b.ctxProvider(height) - evParams := b.keeper.GetParams(ctx) - sstore := evParams.SeiSstoreSetGasEip2200 + sstore := b.keeper.GetSstoreSetGasEIP2200(ctx) return types.DefaultChainConfig().EthereumConfigWithSstore(b.keeper.ChainID(ctx), &sstore) } diff --git a/evmrpc/subscribe.go b/evmrpc/subscribe.go index f938f1a872..e6cd0a5417 100644 --- a/evmrpc/subscribe.go +++ b/evmrpc/subscribe.go @@ -168,11 +168,17 @@ func (a *SubscriptionAPI) Logs(ctx context.Context, filter *filters.FilterCriter rpcSub := notifier.CreateSubscription() + // Track subscription metrics + wpMetrics := GetGlobalMetrics() + wpMetrics.RecordSubscriptionStart() + if filter.BlockHash != nil { go func() { defer recoverAndLog() + defer wpMetrics.RecordSubscriptionEnd() logs, _, err := a.logFetcher.GetLogsByFilters(ctx, *filter, 0) if err != nil { + wpMetrics.RecordSubscriptionError() _ = notifier.Notify(rpcSub.ID, err) return } @@ -187,10 +193,12 @@ func (a *SubscriptionAPI) Logs(ctx context.Context, filter *filters.FilterCriter go func() { defer recoverAndLog() + defer wpMetrics.RecordSubscriptionEnd() begin := int64(0) for { logs, lastToHeight, err := a.logFetcher.GetLogsByFilters(ctx, *filter, begin) if err != nil { + wpMetrics.RecordSubscriptionError() _ = notifier.Notify(rpcSub.ID, err) return } diff --git a/evmrpc/tests/mock_data/2245.code b/evmrpc/tests/mock_data/2245.code new file mode 100755 index 0000000000..429b11fd80 Binary files /dev/null and b/evmrpc/tests/mock_data/2245.code differ diff --git a/evmrpc/tests/mock_data/transactions/0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c.json b/evmrpc/tests/mock_data/transactions/0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c.json new file mode 100644 index 0000000000..51160a9662 --- /dev/null +++ b/evmrpc/tests/mock_data/transactions/0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c.json @@ -0,0 +1,14582 @@ +{ + "jsonrpc": "2.0", + "id": 1376, + "result": { + "app": { + "modules": { + "acc": { + "reads": { + "012deb30545651ea6402bb5852883a5f37898eeaea": "0a202f636f736d6f732e617574682e763162657461312e426173654163636f756e7412310a2a736569313968346e71347a6b323834786771346d7470666773776a6c78377963613668326d346d6c766e1887eada23", + "017aae9bb618042278b07ac7396146f6e483afe6b5": "0a202f636f736d6f732e617574682e763162657461312e426173654163636f756e74127a0a2a73656931303268666864736371733338337672366375756b7a33686b756a70366c65343470336d646e7a12460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21027302a357ee8da646d9d9390118db2e00dd2e363914e0a9e56f676cd7e6aee65718f78b38201b", + "0193354845030274cd4bf1686abd60ab28ec52e1a7": "0a222f636f736d6f732e617574682e763162657461312e4d6f64756c654163636f756e74123e0a2e0a2a736569316a7636357333677271663676366a6c33647034743663397439726b3939636438326e34323037181b120c646973747269627574696f6e", + "019475871f8418531ad9a0d5dfddddb786560a7b4f": "0a202f636f736d6f732e617574682e763162657461312e426173654163636f756e7412790a2a736569316a3336637738757972706633346b6471366830616d68646873657471353736306c376c71733412460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a2102a45b4387bd894a30794c3655d86838f48aec707b84aaf8792abddccf9990ea5918fef2d60b", + "01f1829676db577682e944fc3493d451b67ff3e29f": "0a222f636f736d6f732e617574682e763162657461312e4d6f64756c654163636f756e74123f0a2e0a2a736569313778706676616b6d32616d67393632796c73366638347a336b656c6c3863356c61346a6b6475181a120d6665655f636f6c6c6563746f72" + }, + "has": [ + "0193354845030274cd4bf1686abd60ab28ec52e1a7" + ] + }, + "bank": { + "reads": { + "02142deb30545651ea6402bb5852883a5f37898eeaea75736569": "", + "021465766d5f636f696e62617365000000000000000075736569": "", + "02147aae9bb618042278b07ac7396146f6e483afe6b575736569": "0a04757365691209313130303739323236", + "021493354845030274cd4bf1686abd60ab28ec52e1a775736569": "0a0475736569120e3135353134333431363431383032", + "02149475871f8418531ad9a0d5dfddddb786560a7b4f75736569": "0a0475736569120737383233383639", + "0214f1829676db577682e944fc3493d451b67ff3e29f75736569": "0a047573656912053337383038", + "042deb30545651ea6402bb5852883a5f37898eeaea": "", + "0465766d5f636f696e626173650000000000000000": "", + "047aae9bb618042278b07ac7396146f6e483afe6b5": "343438373932353330313633", + "049475871f8418531ad9a0d5dfddddb786560a7b4f": "393538323037373836303431" + }, + "has": [ + "0214f1829676db577682e944fc3493d451b67ff3e29f75736569" + ] + }, + "distribution": { + "reads": { + "00": "0a200a04757365691218343735353437343132383539363531303237373535373434", + "01": "0a1459e78e0b1133144460575337faa2558399e43661", + "0214130a25380b8d4edb981389ccc3b590e78f8fe6a6": "0a260a0475736569121e343439363436373039303130333631313230303936333536383131303433", + "021421d5ba122ecb253cf76243c3b31fcd1766430aeb": "0a260a0475736569121e393637333837393733383635393734323739373330353137323531373935", + "021433f052e4f7e6777c4afccd6613e0efa38b63ce6c": "0a260a0475736569121e313735363734313137343531323739353036363838393232343931393434", + "021435cd3eb6383e81169d088138aacbc3792968e535": "0a260a0475736569121e393432393431333232373833323539383231373133313434333134303536", + "021436de192e20837f8d72b3f26412600da5fc277fbe": "0a250a0475736569121d3831323534393836373633373136343136373039333633393939363231", + "02143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6": "0a260a0475736569121e323034323733363236323735383236393838303830363834363939353838", + "021447462ada49474676b881e9389c755be490b49bec": "0a260a0475736569121e313731313238323430363837343236323239303433373234373133343339", + "021448592266a3c036d8698c1c989a87e79260ca32d3": "0a260a0475736569121e313038363136353635363137323939373534323935313935343934393434", + "02145598f88b7f800c7306d67d1a7c95afa4bb3f69c6": "0a260a0475736569121e333032313639333933323936313232353537303634353938313933313639", + "0214595208813bf4d1de510338109a342914808f16c9": "0a260a0475736569121e343039343437363133363436373233333738333134393237313034393431", + "02146c7a35061d2e3b4a02b492220d263f5ec237cda0": "0a260a0475736569121e373834313234383134333832323138333734393035323834303439333235", + "02146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8": "0a250a0475736569121d3333313838393033363232333232383538353733393232383630393232", + "021473921de199b8344034c9c62141b47ead011b6c8f": "0a260a0475736569121e383437303430373032363835363639383731353337343036323938313630", + "0214787f6b6d9ea782923480c17d03f84802cf560c9a": "0a250a0475736569121d3431393035353137373338323234303239303336383237393730343138", + "02147e34318a94e5add4f872ce477099c1067f55ffe2": "0a250a0475736569121d3936343733393036353231363633393938363839313433333536303037", + "0214805118d40d8197bf88132b217a6b55f79cd7dc74": "0a260a0475736569121e333331303030353137393635383435333734383639373339353931373536", + "02148d02754dbcb739916788ee56633e12916d372039": "0a260a0475736569121e333837373233323835343732373230373938383931313333373632313330", + "0214a1909b17135d3469300ccae4c445df07e1f4cc09": "0a260a0475736569121e313938353737333133313333343937303338383235343034373731313833", + "0214abffa229018a0cce93405cfcf1e7c2541e89d3c2": "0a260a0475736569121e373334393536393839303731313531363930383135303139323433303232", + "0214aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd": "0a260a0475736569121e393539393733343833353734303630323133313439303739323432323635", + "0214af227c7f56980d0d321efcbcc1259d0d54426223": "0a260a0475736569121e333338363038313833343238333530323931393439393034383034353737", + "0214ba77322d09f457e5d5c26f459919617654bff49f": "0a260a0475736569121e313333323632383135353938333239343732393939363439393332303437", + "0214bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92": "0a260a0475736569121e343735373138373337363631333632373737373538383831383635343939", + "0214c81136fb247de77e9c634f2d21c3aee7ef3ebc5d": "0a260a0475736569121e333930333130373637323932353331353330313739313236383331373932", + "0214d065447e409820fec8ddb630995f8fa1302094fe": "0a260a0475736569121e373339353737333839393037363938333238373436383536373836363034", + "0214d87251b6de26392467c32cf125d736eed036e088": "0a270a0475736569121f31323133373131303535393132353339323138393831393035353935353731", + "0214dee81d76ca716b870c8f9d54134610ec90459a6e": "0a260a0475736569121e333936323439383731303436343939313132353538323539353534313834", + "0214e1be9f6d833cf218a37ee352ae1479dee0a91240": "0a250a0475736569121d3735333839323630363237313234363834353333383731323734353036", + "0214e6f732543aad0c3e9b15dfa61ba7cc375c912e21": "0a260a0475736569121e343238303536393839323832383535373730383939353534313433363638", + "0214f23a595fb5a238f33ea41ed21906d0d83353bb81": "0a260a0475736569121e353136373831383436373438313139333532323830303633393132383736", + "0614130a25380b8d4edb981389ccc3b590e78f8fe6a6": "0a1f0a04757365691217333731393930373131373139373231323735313830393510ecec05", + "061421d5ba122ecb253cf76243c3b31fcd1766430aeb": "0a210a047573656912193735393735333632363833363539393531313737343636323610a9a601", + "061433f052e4f7e6777c4afccd6613e0efa38b63ce6c": "0a220a0475736569121a363038303938383131323535313835303434373831353737333510da01", + "061435cd3eb6383e81169d088138aacbc3792968e535": "0a210a04757365691219313235323935333737373831323931353434343930313638311081b303", + "061436de192e20837f8d72b3f26412600da5fc277fbe": "0a200a0475736569121837373437303439303234393436373530373130373131353210ec4d", + "06143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6": "0a210a047573656912193433323030363934363632373336383130303535373235323510ff4d", + "061447462ada49474676b881e9389c755be490b49bec": "0a210a047573656912193837343432333734313535373939363234373733313131363710823d", + "061448592266a3c036d8698c1c989a87e79260ca32d3": "0a220a0475736569121a3132343335393235303038353634333636373830383834303538108947", + "06145598f88b7f800c7306d67d1a7c95afa4bb3f69c6": "0a260a0475736569121e313637303031363934323038383637303832393939343735373930333930101a", + "0614595208813bf4d1de510338109a342914808f16c9": "0a200a0475736569121832343434313632333638343337323531353633313431333110aea502", + "06146c7a35061d2e3b4a02b492220d263f5ec237cda0": "0a220a0475736569121a313033333936393239333238343239373539353231333832363010e4c301", + "06146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8": "0a220a0475736569121a313231353234363138363235343435353631313135333831393210cb73", + "061473921de199b8344034c9c62141b47ead011b6c8f": "0a210a047573656912193731393430323531383635343031393830303236373031333910aa9f05", + "0614787f6b6d9ea782923480c17d03f84802cf560c9a": "0a200a0475736569121832393539383131333931343038383530303733383037383510e85c", + "06147e34318a94e5add4f872ce477099c1067f55ffe2": "0a210a047573656912193933333432313536373633303834393332303532393935303210f116", + "0614805118d40d8197bf88132b217a6b55f79cd7dc74": "0a220a0475736569121a313937303630393535353739323435323236393233313037323510ac9a01", + "06148d02754dbcb739916788ee56633e12916d372039": "0a220a0475736569121a3730313139343736353237313734323937313137383736373138108e01", + "0614a1909b17135d3469300ccae4c445df07e1f4cc09": "0a250a0475736569121d313834303439303938363136333231303433353130303231333431353410b247", + "0614abffa229018a0cce93405cfcf1e7c2541e89d3c2": "0a200a0475736569121831393135383235393238373935393138313336373539393410e88106", + "0614aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd": "0a220a0475736569121a313237373833373833363736303630373030393537313139393510afff08", + "0614af227c7f56980d0d321efcbcc1259d0d54426223": "0a240a0475736569121c3631333038353432303734323334333736353835303834333237363010a125", + "0614ba77322d09f457e5d5c26f459919617654bff49f": "0a220a0475736569121a35373934323735323237353039393435353134323234323039381043", + "0614bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92": "0a220a0475736569121a313332353933343637313635323634313834393933353831373110b2ee02", + "0614c81136fb247de77e9c634f2d21c3aee7ef3ebc5d": "0a200a0475736569121836313134323939303434303233303639393531363231333910aa9402", + "0614d065447e409820fec8ddb630995f8fa1302094fe": "0a200a0475736569121835333239323036323238323530353738353434333231363010e59701", + "0614d87251b6de26392467c32cf125d736eed036e088": "0a210a047573656912193331383938303338303237353430353037343833373136303110edb404", + "0614dee81d76ca716b870c8f9d54134610ec90459a6e": "0a1f0a04757365691217343531353034393031383839323032323931323938313810a3f603", + "0614e1be9f6d833cf218a37ee352ae1479dee0a91240": "0a210a0475736569121939323032303032303135333434383534383733383137373331103b", + "0614e6f732543aad0c3e9b15dfa61ba7cc375c912e21": "0a220a0475736569121a313334383637313333393636323533323934363939303839313110d0d203", + "0614f23a595fb5a238f33ea41ed21906d0d83353bb81": "0a220a0475736569121a3133323439313836353937303839303632393739323930393035108177", + "0714130a25380b8d4edb981389ccc3b590e78f8fe6a6": "0a250a0475736569121d3431333731323236343130353235353132383433333939383831313937", + "071421d5ba122ecb253cf76243c3b31fcd1766430aeb": "0a250a0475736569121d3236393137343537363032353231303136333530383332373838343434", + "071433f052e4f7e6777c4afccd6613e0efa38b63ce6c": "0a250a0475736569121d3632333638373535333031383638393636393038353830343636333438", + "071435cd3eb6383e81169d088138aacbc3792968e535": "0a250a0475736569121d3436333132333839313434383735323933313939343435313133323430", + "071436de192e20837f8d72b3f26412600da5fc277fbe": "0a240a0475736569121c36303735373736343534303830383039313037393139313635343136", + "07143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6": "0a260a0475736569121e313034353133373835353430363332353532373231363935353232333132", + "071447462ada49474676b881e9389c755be490b49bec": "0a240a0475736569121c38343832323236353638393634393132383733303738353833373632", + "071448592266a3c036d8698c1c989a87e79260ca32d3": "0a200a04757365691218363534353233303536303439323537353633313037373937", + "07145598f88b7f800c7306d67d1a7c95afa4bb3f69c6": "0a250a0475736569121d3436343733393335343932373637313937393235393039323437363437", + "0714595208813bf4d1de510338109a342914808f16c9": "0a250a0475736569121d3138363230313632393932353836393339313234323332333934323233", + "07146c7a35061d2e3b4a02b492220d263f5ec237cda0": "0a250a0475736569121d3433343433313537363334363631323936333131313536353338363937", + "07146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8": "0a240a0475736569121c31313431303133393032323032393439303239303132323038353831", + "071473921de199b8344034c9c62141b47ead011b6c8f": "0a260a0475736569121e343833333738323930363931343932383035313432313531333033343538", + "0714787f6b6d9ea782923480c17d03f84802cf560c9a": "0a230a0475736569121b383133313434353133313735343638363732343831323339363734", + "07147e34318a94e5add4f872ce477099c1067f55ffe2": "0a200a04757365691218313130353032313030343135383933393132383832343634", + "0714805118d40d8197bf88132b217a6b55f79cd7dc74": "0a240a0475736569121c32323634303433303035353731343435303538333130313832353536", + "07148d02754dbcb739916788ee56633e12916d372039": "0a250a0475736569121d3735363836313732373638363335323738323031363931343836303637", + "0714a1909b17135d3469300ccae4c445df07e1f4cc09": "0a230a0475736569121b393639373234373434393439393134343937343331323038303731", + "0714abffa229018a0cce93405cfcf1e7c2541e89d3c2": "0a240a0475736569121c34333934323737343832323832303934353830383630383933393034", + "0714aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd": "0a260a0475736569121e353232303831353131383937353432303534303833353036363635303530", + "0714af227c7f56980d0d321efcbcc1259d0d54426223": "0a250a0475736569121d3138303537383734313335383239333535323538343231353138333538", + "0714ba77322d09f457e5d5c26f459919617654bff49f": "0a250a0475736569121d3434383037363434363535323634343532323430353430343837363031", + "0714bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92": "0a250a0475736569121d3533313530333430343038373431343338343239353537383532393439", + "0714c81136fb247de77e9c634f2d21c3aee7ef3ebc5d": "0a240a0475736569121c35333032383138393532363538323831313630313736373231373539", + "0714d065447e409820fec8ddb630995f8fa1302094fe": "0a240a0475736569121c36333433373333323832353838393635393036343634363133353532", + "0714d87251b6de26392467c32cf125d736eed036e088": "0a260a0475736569121e353736333234343131333730323833303938383836363735303834333735", + "0714dee81d76ca716b870c8f9d54134610ec90459a6e": "0a250a0475736569121d3734323437363939333730373033313732333532343335343034383338", + "0714e1be9f6d833cf218a37ee352ae1479dee0a91240": "0a240a0475736569121c35343930343338343435313736333732303039363733383730333639", + "0714e6f732543aad0c3e9b15dfa61ba7cc375c912e21": "0a200a04757365691218373932313837363137363430303034353438363230343239", + "0714f23a595fb5a238f33ea41ed21906d0d83353bb81": "0a240a0475736569121c31373235323435333033303136333439373236393936393133303237" + }, + "has": [] + }, + "epoch": { + "reads": { + "65706f6368": "0a0608f086aea3061202083c1899fb53220b08e68ef0ca061093a6914028f8c8bf59" + }, + "has": [] + }, + "evm": { + "reads": { + "010d742a9b4d766e256f0c7dd5bbe832337827beb7": "0d742a9b4d766e256f0c7dd5bbe832337827beb7", + "012deb30545651ea6402bb5852883a5f37898eeaea": "2deb30545651ea6402bb5852883a5f37898eeaea", + "013ffeaf16afb4407ca99f87ed321ba0c41257db10": "9475871f8418531ad9a0d5dfddddb786560a7b4f", + "0163b9f25148ccc5337f0a889e8b3f0f8c9130c2fa": "7aae9bb618042278b07ac7396146f6e483afe6b5", + "0165766d5f636f696e626173650000000000000000": "", + "017aae9bb618042278b07ac7396146f6e483afe6b5": "", + "0193354845030274cd4bf1686abd60ab28ec52e1a7": "", + "019475871f8418531ad9a0d5dfddddb786560a7b4f": "", + "020d742a9b4d766e256f0c7dd5bbe832337827beb7": "0d742a9b4d766e256f0c7dd5bbe832337827beb7", + "027aae9bb618042278b07ac7396146f6e483afe6b5": "63b9f25148ccc5337f0a889e8b3f0f8c9130c2fa", + "029475871f8418531ad9a0d5dfddddb786560a7b4f": "3ffeaf16afb4407ca99f87ed321ba0c41257db10", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000000": "0000000001000100000487b800000000002aa9ad98140ee429488810d8ad9500", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000106400640", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000f4b9d8277a871de0d4f0b4e46c3ace3f376d", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000004": "00000000000001220ce3435a47013f47000000000000000000000000249a0e30", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000005": "000000000000000000000000000000000000000000000000269f35da2d385b44", + "03038aac60e1d17ce2229812eca8ee7800214baffc0000000000000000000000000000000000000000000000000000000000000009": "01000000000000000008c68f26296cb90923d36de10003a57b7625ce695c0791", + "03038aac60e1d17ce2229812eca8ee7800214baffc8b90de20839b2ea9fccd78036cf348f2c13e50a7ee765d9024c902050fce4a8a": "", + "030d742a9b4d766e256f0c7dd5bbe832337827beb70000000000000000000000000000000000000000000000000000000000000002": "00000000000000000000000075e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81", + "030d742a9b4d766e256f0c7dd5bbe832337827beb70000000000000000000000000000000000000000000000000000000000000003": "000000000000000000000000000000311c68cba94362fafe7cc8b09d302509dc", + "030d742a9b4d766e256f0c7dd5bbe832337827beb70000000000000000000000000000000000000000000000000000000000000004": "00000000000000000000000000000000000000000000000000000000695c0783", + "030d742a9b4d766e256f0c7dd5bbe832337827beb70000000000000000000000000000000000000000000000000000000000000008": "000000000000000000000000000000000000000000000000001da968ba818a6b", + "030d742a9b4d766e256f0c7dd5bbe832337827beb70000000000000000000000000000000000000000000000000000000000000009": "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "030d742a9b4d766e256f0c7dd5bbe832337827beb79aa0cf691f429ebbe4723b04d92b574d165d9e5107d3c42b37606230bc6af40b": "0000000000000000000000000000000000000000000000000000000000000000", + "030d742a9b4d766e256f0c7dd5bbe832337827beb79c4cde0997d4d22607b2edec6cde69ac2890fa65f5fdbba8294992f577767171": "00000000000000000000000063b9f25148ccc5337f0a889e8b3f0f8c9130c2fa", + "030d742a9b4d766e256f0c7dd5bbe832337827beb7ef8de8f2652c1c204827c86c2f190d739a336d3d72fdcaa912dccd39d34d0a59": "0000000000000000000000000000000000000000000000000000000000000001", + "030d742a9b4d766e256f0c7dd5bbe832337827beb7ef8de8f2652c1c204827c86c2f190d739a336d3d72fdcaa912dccd39d34d0a5a": "000000000000000000000000000000000000000000000389f0048f31f10dbaee", + "030d742a9b4d766e256f0c7dd5bbe832337827beb7ef8de8f2652c1c204827c86c2f190d739a336d3d72fdcaa912dccd39d34d0a5b": "0000000000000000000000000000000000000000000000000000000000000001", + "030d742a9b4d766e256f0c7dd5bbe832337827beb7f7d6ffdad3aefc75fdb176472b537af1d14e968bf29928c97135a9ad9bdfeafb": "000000000000000000000000000000000000000000000000000000000000067f", + "032deb30545651ea6402bb5852883a5f37898eeaea0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000044eeecb1fe3668ca5dd1f249c88d86717889e603", + "032deb30545651ea6402bb5852883a5f37898eeaea0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000", + "032deb30545651ea6402bb5852883a5f37898eeaea0000000000000000000000000000000000000000000000000000000000000006": "00000000000000000000000044eeecb1fe3668ca5dd1f249c88d86717889e603", + "032deb30545651ea6402bb5852883a5f37898eeaea61773696cf0b5313953d7484c5c2d682f08850ee5c025f83f74968b90decbd96": "000000000000000000000000f62bd525e82577a162de88bd70de032a62675237", + "032deb30545651ea6402bb5852883a5f37898eeaea61773696cf0b5313953d7484c5c2d682f08850ee5c025f83f74968b90decbd98": "756e697377617076330000000000000000000000000000000000000000000012", + "032deb30545651ea6402bb5852883a5f37898eeaea76465a6857b9938c6444d4b40a491c9cf505fee630bc3c78c3ad6fd9697538e0": "000000000000000000000000b7fceb027ca002875b6033e90afa1470266655f4", + "032deb30545651ea6402bb5852883a5f37898eeaea76465a6857b9938c6444d4b40a491c9cf505fee630bc3c78c3ad6fd9697538e1": "000000000000000000000001b7fceb027ca002875b6033e90afa1470266655f4", + "032deb30545651ea6402bb5852883a5f37898eeaea76465a6857b9938c6444d4b40a491c9cf505fee630bc3c78c3ad6fd9697538e2": "647261676f6e7377617056320000000000000000000000000000000000000018", + "032deb30545651ea6402bb5852883a5f37898eeaea76465a6857b9938c6444d4b40a491c9cf505fee630bc3c78c3ad6fd9697538e3": "0000000000000000000000000000000000000000000000000000000000000000", + "032deb30545651ea6402bb5852883a5f37898eeaeaac91061a336ed36fc928360c1e0fd10a3f688dcff44639c6d20c113c82d2032e": "000000000000000000000000b243320bcf9c95db7f74108b6773b8f4dc3adaf5", + "032deb30545651ea6402bb5852883a5f37898eeaeaac91061a336ed36fc928360c1e0fd10a3f688dcff44639c6d20c113c82d20330": "756e697377617076330000000000000000000000000000000000000000000012", + "032deb30545651ea6402bb5852883a5f37898eeaeab833baf6bb8fa455fbee60e03cf1a35f43a9c87662413bdd23d8418432a5d600": "0000000000000000000000006081a3b9fa59045eada8580d562b5c56085b6b05", + "032deb30545651ea6402bb5852883a5f37898eeaeab833baf6bb8fa455fbee60e03cf1a35f43a9c87662413bdd23d8418432a5d601": "0000000000000000000000056081a3b9fa59045eada8580d562b5c56085b6b05", + "032deb30545651ea6402bb5852883a5f37898eeaeab833baf6bb8fa455fbee60e03cf1a35f43a9c87662413bdd23d8418432a5d602": "7361696c6f72000000000000000000000000000000000000000000000000000c", + "032deb30545651ea6402bb5852883a5f37898eeaeab833baf6bb8fa455fbee60e03cf1a35f43a9c87662413bdd23d8418432a5d603": "0000000000000000000000000000000000000000000000000000000000000000", + "032deb30545651ea6402bb5852883a5f37898eeaeae899aefb0facfb28ede7642cce73de5906e6febb1ca655cbb122d7ed940e0b4b": "0000000000000000000000000000000000000000000000000000000000000001", + "032deb30545651ea6402bb5852883a5f37898eeaeaf821477acd379aaaab86fcac6852b30bc05521ab64f39b9d0d39097b53c22ecd": "000000000000000000000000038aac60e1d17ce2229812eca8ee7800214baffc", + "032deb30545651ea6402bb5852883a5f37898eeaeaf821477acd379aaaab86fcac6852b30bc05521ab64f39b9d0d39097b53c22ecf": "756e697377617076330000000000000000000000000000000000000000000012", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe810000000000000000000000000000000000000000000000000000000000000008": "000000000000000000000000000000000000000000000000000000000000007d", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe810000000000000000000000000000000000000000000000000000000000000009": "0000000000000000000000000000000000000000000000000000000000001002", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81000000000000000000000000000000000000000000000000000000000000000a": "0000000000000000000000000000000000000000000000000000000000001003", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81000000000000000000000000000000000000000000000000000000000000000b": "0000000000000000000000000000000000000000000000000000000000001004", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3": "73656931777a687271707266707861676b72787a396673706d6e727463306671", + "0375e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4": "75736b356736796e70657a636c3730357366717335356e717363656a306b0000", + "039151434b16b9763660705744891fa906f660ecc5042f11b974d13f72d29f39b1728d488c47cd652c27d6e64ff3867e5e8347a129": "", + "039151434b16b9763660705744891fa906f660ecc504a962e7f0ecbfe871dfda766a39f85a229c7a1ef4f7c68a67105a01ad249c67": "00000000000000000000000000000000000000000000000000000022bf9e93e8", + "039151434b16b9763660705744891fa906f660ecc5360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "000000000000000000000000af37e8b6c9ed7f6318979f56fc287d76c30847ff", + "039151434b16b9763660705744891fa906f660ecc53e6f4f018f0e271bc2f4208da0207d38b70c2591feb695b805092383c948af41": "0000000000000000000000000000000000000000000000000000002bd389ff98", + "039151434b16b9763660705744891fa906f660ecc58682a1003d487976e5ef8326be9cfbc56236846a4d72547e93e4f3cd7856657b": "0000000000000000000000000000000000000000000000000000000000000000", + "039151434b16b9763660705744891fa906f660ecc5b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "000000000000000000000000cb768e263fb1c62214e7cab4aa8d036d76dc59cc", + "039151434b16b9763660705744891fa906f660ecc5d4ded57f36a644f1ad8bef76cf33a0758805580af974a4bdaca057fa730a9bba": "", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf50000000000000000000000000000000000000000000000000000000000000000": "0001440001000100000487d700000000002aba6768c7c51060f51f90ebc54a87", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf50000000000000000000000000000000000000000000000000000000000000001": "000000000000000000000000000000000000008d9c24b85240c96b7526fd2a9c", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf50000000000000000000000000000000000000000000000000000000000000003": "00000000000005825e15f1511ae68f7f000000000000000000000000bcc0ea51", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf50000000000000000000000000000000000000000000000000000000000000004": "00000000000000000000000000000000000000000000000048ab8bfd0cc0a4f0", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf50000000000000000000000000000000000000000000000000000000000000008": "0100013af20000087ed0da42c2972c16603308c2b50006219d3157d0695c0790", + "03b243320bcf9c95db7f74108b6773b8f4dc3adaf5b72a5233413dd9985e70abb239a7ba917e489fbf2ece87f523c6e26971cc821f": "0000000000800000020000000000a0106571e8efce7fea0020a0684008614202", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf423920000000000000000000000000000000000000000000000000000000000000001": "000000000000000000000000e9db01c79073d8b7036cb0ee1eee72f7493e0c2d", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf4239210d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b": "000000000000000000000000cf79ee2be51a5f0af83f46feff1c435d58b6603d", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf423927050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3": "000000000000000000000000cafdc392214661c8c6c7165e491890ad84bed171", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf42392876edcd1069dd962a95b1a53ef85768538267ee51a59a08605892463ed99f8dc": "000000000000000000000000000000000000000000000000000000ed9c18c962", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf42392f4ff94f68097de1de5a47c034d79c60a90722dd04bfc2bad997fb6ce918f1071": "000000000000000000000000000000000000000000000000000000003b9aca00", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf42392f73e141f770423c206cabc9ca70a8e2c0288746b17163681054123f2eecb96a6": "000000000000000000000000000000000000000000000000000000000d58616f", + "03e15fc38f6d8c56af07bbcbe3baf5708a2bf42392fa7520ad75b8eab6576a7340babbc51f4d4421dc06e77ee3163a62bee1e21dc7": "00000000000000000000000000000000000000000000000000000018399eabe3", + "03e30fedd158a2e3b13e9badaeabafc5516e95e8c799d89e17b17bb72f6099ed039aaa5e5ee2ec2f298268c9a403dc372c2dee8982": "0000000000000000000000000000000000000000000000000000000000000000", + "03e30fedd158a2e3b13e9badaeabafc5516e95e8c7ac91061a336ed36fc928360c1e0fd10a3f688dcff44639c6d20c113c82d2032d": "000000000000000000000000000000000000000000022847976a2f6ecf5602b0", + "03e30fedd158a2e3b13e9badaeabafc5516e95e8c7f821477acd379aaaab86fcac6852b30bc05521ab64f39b9d0d39097b53c22ecc": "000000000000000000000000000000000000000000068e231474c814aa388d99", + "03f62bd525e82577a162de88bd70de032a626752370000000000000000000000000000000000000000000000000000000000000000": "000144000100010000fffffd0000000000000000fff72382d1fe7c33c242ecea", + "03f62bd525e82577a162de88bd70de032a626752370000000000000000000000000000000000000000000000000000000000000002": "000000000000000000000000000000000001c0ae017da0d4af42ee78babdfb0d", + "03f62bd525e82577a162de88bd70de032a626752370000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000a1c8b9d00000000000000000000000009f54994", + "03f62bd525e82577a162de88bd70de032a626752370000000000000000000000000000000000000000000000000000000000000004": "00000000000000000000000000000000000000000000000000025196f3ee6db3", + "03f62bd525e82577a162de88bd70de032a6267523763187d71e139eee983a88d0737447c7451979b3dbb75903c76b5fe430d36588e": "eecd000000000000000000000000000000000000000000000000000000000000", + "070000000000000000000000000000000000001002": "", + "070000000000000000000000000000000000001003": "", + "070000000000000000000000000000000000001004": "", + "07038aac60e1d17ce2229812eca8ee7800214baffc": "608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f43146107fe578063f30583991461081e578063f30dba9314610826578063f637731d146108a8576101ae565b8063c45a0155146107cf578063d0c93a7c146107d7578063d21220a7146107f6576101ae565b8063a34123a7116100c8578063a34123a71461070f578063a38807f214610749578063b0d0d211146107a4576101ae565b806370cf754a146105c357806385b66729146105cb578063883bdbfd14610608576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc1461046f5780634f1eb3d8146104f9578063514ea4bf1461054a5780635339c296146105a3576101ae565b80633850c7bd146103595780633c8a7d8d146103b55780634614131914610455576101ae565b80631ad8b03b1161018c5780631ad8b03b146102a8578063252c09d7146102df57806332148f6714610336576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610284575b600080fd5b6101bb6108ce565b604080516001600160a01b039092168252519081900360200190f35b61026b600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a081016080820135600160201b81111561022d57600080fd5b82018360208201111561023f57600080fd5b803590602001918460018302840111600160201b8311171561026057600080fd5b5090925090506108f2565b6040805192835260208301919091528051918290030190f35b61028c611500565b604080516001600160801b039092168252519081900360200190f35b6102b061150f565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fc600480360360208110156102f557600080fd5b5035611529565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103576004803603602081101561034c57600080fd5b503561ffff1661156e565b005b61036161166a565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015263ffffffff90911660a0840152151560c0830152519081900360e00190f35b61026b600480360360a08110156103cb57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a081016080820135600160201b81111561041757600080fd5b82018360208201111561042957600080fd5b803590602001918460018302840111600160201b8311171561044a57600080fd5b5090925090506116bf565b61045d61197f565b60408051918252519081900360200190f35b6103576004803603608081101561048557600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104bb57600080fd5b8201836020820111156104cd57600080fd5b803590602001918460018302840111600160201b831117156104ee57600080fd5b509092509050611985565b6102b0600480360360a081101561050f57600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611dd6565b6105676004803603602081101561056057600080fd5b5035611ff6565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045d600480360360208110156105b957600080fd5b503560010b612033565b61028c612045565b6102b0600480360360608110156105e157600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516612069565b6106766004803603602081101561061e57600080fd5b810190602081018135600160201b81111561063857600080fd5b82018360208201111561064a57600080fd5b803590602001918460208302840111600160201b8311171561066b57600080fd5b50909250905061233a565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106ba5781810151838201526020016106a2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106f95781810151838201526020016106e1565b5050505090500194505050505060405180910390f35b61026b6004803603606081101561072557600080fd5b508035600290810b91602081013590910b90604001356001600160801b03166123c7565b6107736004803603604081101561075f57600080fd5b508035600290810b9160200135900b612545565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b610357600480360360408110156107ba57600080fd5b5063ffffffff81358116916020013516612735565b6101bb612933565b6107df612957565b6040805160029290920b8252519081900360200190f35b6101bb61297b565b61080661299f565b6040805162ffffff9092168252519081900360200190f35b61045d6129c3565b6108466004803603602081101561083c57600080fd5b503560020b6129c9565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610357600480360360208110156108be57600080fd5b50356001600160a01b0316612a35565b7f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf4239281565b6000806108fd612c42565b85610934576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b9004909116608082015260015463ffffffff811660a083015260ff600160201b90910416151560c082018190526109ec576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a375780600001516001600160a01b0316866001600160a01b0316118015610a32575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a69565b80600001516001600160a01b0316866001600160a01b0316108015610a6957506401000276a36001600160a01b038716115b610aa0576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6001805464ff00000000191690556040805160c08101909152600090808a610ad65760108460a0015163ffffffff16901c610ae0565b60a084015161ffff165b63ffffffff1681526005546001600160801b03166020820152604001610b04612c79565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8057600354610b84565b6002545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd35750886001600160a01b031681604001516001600160a01b031614155b15610fa757610be0615616565b60408201516001600160a01b031681526060820151610c23906007907f00000000000000000000000000000000000000000000000000000000000000018f612c7d565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5457620d89e7196020820152610c73565b6020810151620d89e860029190910b1315610c7357620d89e860208201525b610c808160200151612dbf565b6001600160a01b031660608201526040820151610d11908d610cba578b6001600160a01b031683606001516001600160a01b031611610cd4565b8b6001600160a01b031683606001516001600160a01b0316105b610ce2578260600151610ce4565b8b5b60c085015185517f00000000000000000000000000000000000000000000000000000000000000646130f0565b60c085015260a084015260808301526001600160a01b031660408301528215610d7357610d478160c001518260800151016132e2565b825103825260a0810151610d6990610d5e906132e2565b6020840151906132f8565b6020830152610dae565b610d808160a001516132e2565b825101825260c08101516080820151610da891610d9d91016132e2565b602084015190613314565b60208301525b835163ffffffff1615610dfe576000612710856000015163ffffffff168360c001510281610dd857fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3d57610e318160c00151600160801b8460c001516001600160801b031661332a565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f6657806040015115610f3d578360a00151610ec757610ea5846040015160008760200151886040015188602001518a6060015160096133da909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f1382602001518e610ede57600254610ee4565b84608001515b8f610ef3578560800151610ef7565b6003545b608089015160608a015160408b0151600695949392919061356c565b90508c15610f1f576000035b610f2d8360c001518261363b565b6001600160801b031660c0840152505b8b610f4c578060200151610f55565b60018160200151035b600290810b900b6060830152610fa1565b80600001516001600160a01b031682604001516001600160a01b031614610fa157610f9482604001516136f1565b600290810b900b60608301525b50610bad565b836020015160020b816060015160020b1461108257600080610ff586604001518660400151886020015188602001518a606001518b608001516009613a19909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110b49050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110fa5760c0810151600580546001600160801b0319166001600160801b039092169190911790555b6000808c1561115457608083015160025560a08301516001600160801b0316156111485760a0830151600480546001600160801b031981166001600160801b03918216909301169190911790555b8260a0015191506111a1565b608083015160035560a08301516001600160801b03161561119a5760a0830151600480546001600160801b03808216600160801b92839004821690940116029190911790555b5060a08201515b8315158d1515146111ba57602083015183518d036111c7565b82600001518c0383602001515b90985096508c15611300576000871215611209576112097f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c78f89600003613bb4565b6000611213613d02565b9050336001600160a01b031663fa461e338a8a8e8e6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561129757600080fd5b505af11580156112ab573d6000803e3d6000fd5b505050506112b7613d02565b6112c1828b613e3b565b11156112fa576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b5061142a565b6000881215611337576113377f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423928f8a600003613bb4565b6000611341613e4b565b9050336001600160a01b031663fa461e338a8a8e8e6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113c557600080fd5b505af11580156113d9573d6000803e3d6000fd5b505050506113e5613e4b565b6113ef828a613e3b565b1115611428576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b8d6001600160a01b0316336001600160a01b03167f19b47279256b2a23a1665c810c8d55a1758940ee09377d4f8d26497a3577dc838a8a87604001518860c001518960600151898960405180888152602001878152602001866001600160a01b03168152602001856001600160801b031681526020018460020b8152602001836001600160801b03168152602001826001600160801b0316815260200197505050505050505060405180910390a350506001805464ff000000001916600160201b17905550939a92995091975050505050505050565b6005546001600160801b031681565b6004546001600160801b0380821691600160801b90041682565b60098161ffff811061153a57600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600154600160201b900460ff166115b2576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff00000000191690556115c8612c42565b60008054600160d81b900461ffff16906115e460098385613ee3565b6000805461ffff808416600160d81b810261ffff60d81b1990931692909217909255919250831614611651576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506001805464ff000000001916600160201b17905550565b6000546001546001600160a01b03821691600160a01b810460020b9161ffff600160b81b8304811692600160c81b8104821692600160d81b9091049091169063ffffffff81169060ff600160201b9091041687565b6001546000908190600160201b900460ff16611708576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff00000000191690556001600160801b03851661172957600080fd5b60008061177760405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161176d8a6001600160801b0316613f86565b600f0b9052613f97565b9250925050819350809250600080600086111561179957611796613d02565b91505b84156117aa576117a7613e4b565b90505b336001600160a01b031663d348799787878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b50505050600086111561189757611855613d02565b61185f8388613e3b565b1115611897576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b84156118e7576118a5613e4b565b6118af8287613e3b565b11156118e7576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506001805464ff000000001916600160201b17905550919890975095505050505050565b60035481565b600154600160201b900460ff166119c9576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff00000000191690556119df612c42565b6005546001600160801b031680611a21576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b6000611a56867f000000000000000000000000000000000000000000000000000000000000006462ffffff16620f42406141d5565b90506000611a8d867f000000000000000000000000000000000000000000000000000000000000006462ffffff16620f42406141d5565b90506000611a99613d02565b90506000611aa5613e4b565b90508815611ad857611ad87f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423928b8b613bb4565b8715611b0957611b097f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c78b8a613bb4565b336001600160a01b031663e9cbafb085858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b8b57600080fd5b505af1158015611b9f573d6000803e3d6000fd5b505050506000611bad613d02565b90506000611bb9613e4b565b905081611bc68588613e3b565b1115611bfe576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611c098487613e3b565b1115611c41576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611cca5760015461ffff1660008115611c6e5761271063ffffffff8316850204611c71565b60005b90506001600160801b03811615611ca457600480546001600160801b038082168401166001600160801b03199091161790555b611cbe818503600160801b8d6001600160801b031661332a565b60028054909101905550505b8015611d4f5760015460101c61ffff1660008115611cf45761271063ffffffff8316840204611cf7565b60005b90506001600160801b03811615611d2957600480546001600160801b03600160801b8083048216850182160291161790555b611d43818403600160801b8d6001600160801b031661332a565b60038054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506001805464ff000000001916600160201b179055505050505050505050505050565b6001546000908190600160201b900460ff16611e1f576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff00000000191690556000611e3c600833898961420f565b60038101549091506001600160801b0390811690861611611e5d5784611e6c565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e945783611eaa565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611f0f576003810180546001600160801b031981166001600160801b03918216869003821617909155611f0f907f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf42392908a908616613bb4565b6001600160801b03821615611f75576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f75907f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c7908a908516613bb4565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506001805464ff000000001916600160201b17905590969095509350505050565b60086020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60076020526000908152604090205481565b7f000000000000000000000000000000000000097451ff859c3282305ffa26a9c581565b6001546000908190600160201b900460ff166120b2576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff000000001916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000a51136931fdd3875902618bf6b3abe38ab2d703b1691638da5cb5b916004828101926020929190829003018186803b15801561212057600080fd5b505afa158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b50516001600160a01b0316331461216057600080fd5b6004546001600160801b039081169085161161217c5783612189565b6004546001600160801b03165b6004549092506001600160801b03600160801b9091048116908416116121af57826121c3565b600454600160801b90046001600160801b03165b90506001600160801b03821615612244576004546001600160801b03838116911614156121f257600019909101905b600480546001600160801b031981166001600160801b03918216859003821617909155612244907f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423929087908516613bb4565b6001600160801b038116156122ca576004546001600160801b03828116600160801b90920416141561227557600019015b600480546001600160801b03600160801b8083048216859003821602918116919091179091556122ca907f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c79087908416613bb4565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36001805464ff000000001916600160201b1790559094909350915050565b606080612345612c42565b6123bc612350612c79565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600554600996959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614273565b915091509250929050565b6001546000908190600160201b900460ff16612410576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff000000001916905560408051608081018252338152600287810b602083015286900b918101919091526000908190819061246d90606081016124606001600160801b038a16613f86565b600003600f0b9052613f97565b925092509250816000039450806000039350600085118061248e5750600084115b156124cd576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506001805464ff000000001916600160201b179055509094909350915050565b6000806000612552612c42565b61255c85856143cd565b600285810b810b600090815260066020819052604080832088850b90940b8352822060038401549182900b93600160381b83046001600160a01b0316928492600160d81b820463ffffffff16928492909190600160f81b900460ff16806125c257600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff168061260357600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b909204909316608083015260015463ffffffff811660a084015260ff600160201b90910416151560c08301529093508e820b910b121590506126ab5750939094039650900393509003905061272e565b8a60020b816020015160020b121561271f5760006126c7612c79565b60208301516040840151600554606086015193945060009384936126fd936009938893879392916001600160801b0316906133da565b9a9003989098039b50509490960392909203965090910303925061272e915050565b50949093039650039350900390505b9250925092565b600154600160201b900460ff16612779576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6001805464ff000000001916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000a51136931fdd3875902618bf6b3abe38ab2d703b1691638da5cb5b916004828101926020929190829003018186803b1580156127e757600080fd5b505afa1580156127fb573d6000803e3d6000fd5b505050506040513d602081101561281157600080fd5b50516001600160a01b0316331461282757600080fd5b63ffffffff8216158061285557506103e88263ffffffff16101580156128555750610fa08263ffffffff1611155b801561288a575063ffffffff8116158061288a57506103e88163ffffffff161015801561288a5750610fa08163ffffffff1611155b61289357600080fd5b6001805465ffffffff0000601084901b16840163ffffffff90811663ffffffff19831617909255167fb3159fed3ddfba67bae294599eafe2d0ec98c08bb38e0e5fb87d33154b6e05aa62010000826040805163ffffffff939092068316825261ffff601086901c16602083015286831682820152918516606082015290519081900360800190a150506001805464ff000000001916600160201b17905550565b7f000000000000000000000000a51136931fdd3875902618bf6b3abe38ab2d703b81565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c781565b7f000000000000000000000000000000000000000000000000000000000000006481565b60025481565b60066020819052600091825260409091208054600182015460028301546003909301546001600160801b03831694600160801b909304600f0b93919281900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a78576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a83826136f1565b9050600080612a9b612a93612c79565b600990614496565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff8981166060880181905290891660808801819052630640064060a08901819052600160c0909901899052835473ffffffffffffffffffffffffffffffffffffffff1916881762ffffff60a01b1916600160a01b62ffffff9888900b9890981697909702969096177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9092029190911761ffff60d81b1916600160d81b9091021790558454600160201b63ffffffff1990911690931764ff00000000191692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612beb57fe5b05029050600083600281900b620d89e881612c0257fe5b0502905060008460020b83830360020b81612c1957fe5b0560010190508062ffffff166001600160801b03801681612c3657fe5b0493505050505b919050565b306001600160a01b037f000000000000000000000000038aac60e1d17ce2229812eca8ee7800214baffc1614612c7757600080fd5b565b4290565b60008060008460020b8660020b81612c9157fe5b05905060008660020b128015612cb857508460020b8660020b81612cb157fe5b0760020b15155b15612cc257600019015b8315612d3757600080612cd4836144e2565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612d1957888360ff16860302612d2c565b88612d23826144f4565b840360ff168603025b965050505050612db5565b600080612d46836001016144e2565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d9857888360ff0360ff16866001010102612dae565b8883612da383614593565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612dd6578260020b612dde565b8260020b6000035b9050620d89e8811115612e1c576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612e3057600160801b612e42565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e76576ffff97272373d413259a46990580e213a0260801c5b6004821615612e95576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612eb4576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612ed3576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ef2576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612f11576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612f30576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612f50576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f70576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f90576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612fb0576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612fd0576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612ff0576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613010576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613030576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613051576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613071576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613090576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156130ad576b048a170391f7dc42444e8fa20260801c5b60008460020b13156130c85780600019816130c457fe5b0490505b600160201b8106156130db5760016130de565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131755760006131298989620f42400362ffffff16620f424061332a565b9050826131425761313d8c8c8c600161467d565b61314f565b61314f8b8d8c60016146f8565b9550858110613160578a965061316f565b61316c8c8b83866147b5565b96505b506131bf565b8161318c576131878b8b8b60006146f8565b613199565b6131998a8c8b600061467d565b93508388600003106131ad578995506131bf565b6131bc8b8a8a60000385614801565b95505b6001600160a01b038a8116908716148215613222578080156131de5750815b6131f4576131ef878d8c60016146f8565b6131f6565b855b9550808015613203575081155b61321957613214878d8c600061467d565b61321b565b845b945061326c565b80801561322c5750815b6132425761323d8c888c600161467d565b613244565b855b9550808015613251575081155b613267576132628c888c60006146f8565b613269565b845b94505b8115801561327c57508860000385115b15613288578860000394505b8180156132a757508a6001600160a01b0316876001600160a01b031614155b156132b65785890393506132d3565b6132d0868962ffffff168a620f42400362ffffff166141d5565b93505b50505095509550955095915050565b6000600160ff1b82106132f457600080fd5b5090565b8082038281131560008312151461330e57600080fd5b92915050565b8181018281121560008312151461330e57600080fd5b6000808060001985870986860292508281109083900303905080613360576000841161335557600080fd5b5082900490506133d3565b80841161336c57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613480576000898661ffff1661ffff81106133fb57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461346c57613469818a898861484d565b90505b806020015181604001519250925050613560565b8688036000806134958c8c858c8c8c8c6148fd565b91509150816000015163ffffffff168363ffffffff1614156134c7578160200151826040015194509450505050613560565b805163ffffffff848116911614156134ef578060200151816040015194509450505050613560565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b8161351d57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b0316028161354f57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b03600160381b8085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b12156136a057826001600160801b03168260000384039150816001600160801b03161061369b576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b61330e565b826001600160801b03168284019150816001600160801b0316101561330e576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b0383161080159061372d575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613762576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061380357607f810383901c915061380d565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14613a0a57886001600160a01b03166139ee82612dbf565b6001600160a01b03161115613a035781613a05565b805b613a0c565b815b9998505050505050505050565b6000806000898961ffff1661ffff8110613a2f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a9e5788859250925050613560565b8461ffff168461ffff16118015613abf57506001850361ffff168961ffff16145b15613acc57839150613ad0565b8491505b8161ffff168960010161ffff1681613ae457fe5b069250613af38189898961484d565b8a8461ffff1661ffff8110613b0457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c305780518252601f199092019160209182019101613c11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c92576040519150601f19603f3d011682016040523d82523d6000602084013e613c97565b606091505b5091509150818015613cc5575080511580613cc55750808060200190516020811015613cc257600080fd5b50515b613cfb576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423921693919290918291908083835b60208310613d9b5780518252601f199092019160209182019101613d7c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dfb576040519150601f19603f3d011682016040523d82523d6000602084013e613e00565b606091505b5091509150818015613e1457506020815110155b613e1d57600080fd5b808060200190516020811015613e3257600080fd5b50519250505090565b8082018281101561330e57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c716939192909182919080838360208310613d9b5780518252601f199092019160209182019101613d7c565b6000808361ffff1611613f21576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f375750816133d3565b825b8261ffff168161ffff161015613f7d576001858261ffff1661ffff8110613f5c57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f39565b50909392505050565b80600f81900b8114612c3d57600080fd5b6000806000613fa4612c42565b613fb6846020015185604001516143cd565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b90940416608085015260015463ffffffff811660a086015260ff600160201b90910416151560c0850152885190890151948901519289015193946140589491939092909190614af7565b93508460600151600f0b6000146141cd57846020015160020b816020015160020b12156140ad576140a661408f8660200151612dbf565b61409c8760400151612dbf565b8760600151614cac565b92506141cd565b846040015160020b816020015160020b12156141a35760055460408201516001600160801b03909116906140ff906140e3612c79565b6020850151606086015160808701516009949392918791613a19565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b93909216929092021790558151604087015161414f919061414590612dbf565b8860600151614cac565b935061416d6141618760200151612dbf565b83516060890151614cf0565b925061417d81876060015161363b565b600580546001600160801b0319166001600160801b0392909216919091179055506141cd565b6141ca6141b38660200151612dbf565b6141c08760400151612dbf565b8760600151614cf0565b91505b509193909250565b60006141e284848461332a565b9050600082806141ee57fe5b84860911156133d357600019811061420557600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff16116142b3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff811180156142cb57600080fd5b506040519080825280602002602001820160405280156142f5578160200160208202803683370190505b509150865167ffffffffffffffff8111801561431057600080fd5b5060405190808252806020026020018201604052801561433a578160200160208202803683370190505b50905060005b87518110156143c05761436b8a8a8a848151811061435a57fe5b60200260200101518a8a8a8a6133da565b84838151811061437757fe5b6020026020010184848151811061438a57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614340565b5097509795505050505050565b8060020b8260020b1261440d576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614450576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614492576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b600080821161450257600080fd5b600160801b821061451557608091821c91015b68010000000000000000821061452d57604091821c91015b600160201b821061454057602091821c91015b62010000821061455257601091821c91015b610100821061456357600891821c91015b6010821061457357600491821c91015b6004821061458357600291821c91015b60028210612c3d57600101919050565b60008082116145a157600080fd5b5060ff6001600160801b038216156145bc57607f19016145c4565b608082901c91505b67ffffffffffffffff8216156145dd57603f19016145e5565b604082901c91505b63ffffffff8216156145fa57601f1901614602565b602082901c91505b61ffff82161561461557600f190161461d565b601082901c91505b60ff82161561462f5760071901614637565b600882901c91505b600f8216156146495760031901614651565b600482901c91505b6003821615614663576001190161466b565b600282901c91505b6001821615612c3d5760001901919050565b6000836001600160a01b0316856001600160a01b0316111561469d579293925b816146ca576146c5836001600160801b03168686036001600160a01b0316600160601b61332a565b6146ed565b6146ed836001600160801b03168686036001600160a01b0316600160601b6141d5565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115614718579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661475457600080fd5b8361478457866001600160a01b03166147778383896001600160a01b031661332a565b8161477e57fe5b046147aa565b6147aa61479b8383896001600160a01b03166141d5565b886001600160a01b0316614d1f565b979650505050505050565b600080856001600160a01b0316116147cc57600080fd5b6000846001600160801b0316116147e257600080fd5b816147f4576146c58585856001614d2a565b6146ed8585856001614e0b565b600080856001600160a01b03161161481857600080fd5b6000846001600160801b03161161482e57600080fd5b81614840576146c58585856000614e0b565b6146ed8585856000614d2a565b614855615652565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116148a95760016148ab565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148d657fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614905615652565b61490d615652565b888561ffff1661ffff811061491e57fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061498290899089614f00565b156149ba578663ffffffff16826000015163ffffffff1614156149a457613560565b816149b18389898861484d565b91509150613560565b888361ffff168660010161ffff16816149cf57fe5b0661ffff1661ffff81106149df57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a9457604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614aa388836000015189614f00565b614ada576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614ae78989898887614fc1565b9150915097509795505050505050565b6000614b06600887878761420f565b60025460035491925090600080600f87900b15614c4c576000614b27612c79565b6000805460055492935090918291614b719160099186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b9004166133da565b9092509050614bab60068d8b8d8b8b87898b60007f000000000000000000000000000000000000097451ff859c3282305ffa26a9c561515f565b9450614be260068c8b8d8b8b87898b60017f000000000000000000000000000000000000097451ff859c3282305ffa26a9c561515f565b93508415614c1657614c1660078d7f000000000000000000000000000000000000000000000000000000000000000161532d565b8315614c4857614c4860078c7f000000000000000000000000000000000000000000000000000000000000000161532d565b5050505b600080614c5e60068c8c8b8a8a615393565b9092509050614c6f878a848461543f565b600089600f0b1215614c9d578315614c8c57614c8c60068c6155d4565b8215614c9d57614c9d60068b6155d4565b50505050505095945050505050565b60008082600f0b12614cd257614ccd614cc885858560016146f8565b6132e2565b6146f0565b614ce5614cc885858560000360006146f8565b600003949350505050565b60008082600f0b12614d0c57614ccd614cc8858585600161467d565b614ce5614cc8858585600003600061467d565b808204910615150190565b60008115614d9d5760006001600160a01b03841115614d6057614d5b84600160601b876001600160801b031661332a565b614d78565b6001600160801b038516606085901b81614d7657fe5b045b9050614d95614d906001600160a01b03881683613e3b565b615600565b9150506146f0565b60006001600160a01b03841115614dcb57614dc684600160601b876001600160801b03166141d5565b614de2565b614de2606085901b6001600160801b038716614d1f565b905080866001600160a01b031611614df957600080fd5b6001600160a01b0386160390506146f0565b600082614e195750836146f0565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614eb9576001600160a01b03861684810290858281614e5957fe5b041415614e8a57818101828110614e8857614e7e83896001600160a01b0316836141d5565b93505050506146f0565b505b614eb082614eab878a6001600160a01b03168681614ea457fe5b0490613e3b565b614d1f565b925050506146f0565b6001600160a01b03861684810290858281614ed057fe5b04148015614edd57508082115b614ee657600080fd5b808203614e7e614d90846001600160a01b038b16846141d5565b60008363ffffffff168363ffffffff1611158015614f2a57508363ffffffff168263ffffffff1611155b15614f46578163ffffffff168363ffffffff16111590506133d3565b60008463ffffffff168463ffffffff1611614f6d578363ffffffff16600160201b01614f75565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614fa5578363ffffffff16600160201b01614fad565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fc9615652565b614fd1615652565b60008361ffff168560010161ffff1681614fe757fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff8716828161501457fe5b0661ffff811061502057fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061508a57806001019250614fff565b898661ffff16826001018161509b57fe5b0661ffff81106150a757fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201528551909450600090615111908b908b614f00565b905080801561512a575061512a8a8a8760000151614f00565b156151355750615152565b806151455760018203925061514c565b8160010193505b50614fff565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b03168261518a828d61363b565b9050846001600160801b0316816001600160801b031611156151d8576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b038281161590821615811415945015615292578c60020b8e60020b1361527a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff16600160381b6001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152db5782546152d6906152d190600160801b9004600f90810b810b908f900b613314565b613f86565b6152fc565b82546152fc906152d190600160801b9004600f90810b810b908f900b6132f8565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533c57fe5b0760020b1561534a57600080fd5b6000806153658360020b8560020b8161535f57fe5b056144e2565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d9575050600182015460028301546153ec565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540e57505060018301546002840154615421565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154de5781516001600160801b03166154d6576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154ed565b81516154ea908661363b565b90505b60006155118360200151860384600001516001600160801b0316600160801b61332a565b905060006155378460400151860385600001516001600160801b0316600160801b61332a565b905086600f0b60001461555e5787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558c57506000816001600160801b0316115b156155ca576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612c3d57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a", + "070d742a9b4d766e256f0c7dd5bbe832337827beb7": "608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fce8234116100c35780638f10369a1161007c5780638f10369a14610315578063983d95ce1461031e5780639e71310314610331578063e3161ddd14610351578063f2fde38b14610374578063f40f0f521461038757600080fd5b80636fce8234146102b0578063715018a6146102c35780637542b4d3146102cb5780637c0b8de2146102de57806382bfefc8146102f15780638da5cb5b1461030457600080fd5b80634641257d116101155780634641257d146102385780634def1c8214610240578063598b8e71146102495780635a2f3d091461025c57806366da58151461026a5780636ba42aaa1461027d57600080fd5b806314b9302e14610152578063150b7a021461016e5780631959a002146101a657806319983251146101e25780631caaa487146101f7575b600080fd5b61015b600a5481565b6040519081526020015b60405180910390f35b61018d61017c3660046113c2565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610165565b6101cd6101b4366004611461565b6006602052600090815260409020805460019091015482565b60408051928352602083019190915201610165565b6101f56101f0366004611485565b61039a565b005b610220610205366004611485565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610165565b6101f56104b2565b61015b600b5481565b6101f56102573660046114ea565b610561565b6003546004546101cd919082565b6101f5610278366004611485565b61082d565b6102a061028b366004611461565b60076020526000908152604090205460ff1681565b6040519015158152602001610165565b6101f56102be3660046114ea565b610879565b6101f5610916565b6101f56102d93660046114ea565b61092a565b600254610220906001600160a01b031681565b600154610220906001600160a01b031681565b6000546001600160a01b0316610220565b61015b60085481565b6101f561032c3660046114ea565b6109bf565b61034461033f366004611461565b610cdb565b604051610165919061152c565b610359610d4a565b60408051825181526020928301519281019290925201610165565b6101f5610382366004611461565b610e96565b61015b610395366004611461565b610f0f565b6000546001600160a01b03163314806103c257503360009081526007602052604090205460ff165b6104005760405162461bcd60e51b815260206004820152600a6024820152693737ba1035b2b2b832b960b11b60448201526064015b60405180910390fd5b610408610d4a565b50600080600b5411801561041d5750600b5442105b1561044657600042600b546104329190611586565b905080600854610442919061159f565b9150505b61045081836115b6565b91506000600a548361046291906115c9565b6008819055600a5490915061047790426115b6565b600b556040518181527fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a2789060200160405180910390a1505050565b60006104bc610d4a565b33600090815260066020526040812060095483518254949550919390916104e29161159f565b6104ec91906115c9565b9050600082600101548261050091906115eb565b600184018390559050801561052657600154610526906001600160a01b0316338361104a565b60405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a250505050565b600061056b610d4a565b33600090815260066020526040902080549192509061058b9084906115b6565b8155600954825161059c908561159f565b6105a691906115c9565b81600101546105b59190611612565b600182015560005b838110156107ee5760025433906001600160a01b0316636352211e8787858181106105ea576105ea61163a565b905060200201356040518263ffffffff1660e01b815260040161060f91815260200190565b602060405180830381865afa15801561062c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106509190611650565b6001600160a01b0316146106995760405162461bcd60e51b815260206004820152601060248201526f21a422a31d1010a7232a1027bbb732b960811b60448201526064016103f7565b60028201546003830160008787858181106106b6576106b661163a565b90506020020135815260200190815260200160002081905550816002018585838181106106e5576106e561163a565b8354600181018555600094855260208086209202939093013592019190915550339060059087878581811061071c5761071c61163a565b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b03928316179055600254166323b872dd333088888681811061076c5761076c61163a565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156107c357600080fd5b505af11580156107d7573d6000803e3d6000fd5b5050505080806107e69061166d565b9150506105bd565b50604051838152339081907fe31c7b8d08ee7db0afa68782e1028ef92305caeea8626633ad44d413e30f6b2f906020015b60405180910390a350505050565b6108356110a1565b61083d610d4a565b5060088190556040518181527fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a2789060200160405180910390a150565b6108816110a1565b6000815b808210156109105760008484848181106108a1576108a161163a565b90506020020160208101906108b69190611461565b6001600160a01b03811660009081526007602052604090205490915060ff166108fd576001600160a01b0381166000908152600760205260409020805460ff191660011790555b50816109088161166d565b925050610885565b50505050565b61091e6110a1565b61092860006110fb565b565b6109326110a1565b6000815b808210156109105760008484848181106109525761095261163a565b90506020020160208101906109679190611461565b6001600160a01b03811660009081526007602052604090205490915060ff16156109ac576001600160a01b0381166000908152600760205260409020805460ff191690555b50816109b78161166d565b925050610936565b60006109c9610d4a565b336000908152600660205260409020600954825192935090916109ec908561159f565b6109f691906115c9565b8160010154610a0591906115eb565b60018201558054610a17908490611586565b815560005b83811015610ca6573360056000878785818110610a3b57610a3b61163a565b60209081029290920135835250810191909152604001600020546001600160a01b031614610a9e5760405162461bcd60e51b815260206004820152601060248201526f21a422a31d1010a7232a1027bbb732b960811b60448201526064016103f7565b6002546001600160a01b03166323b872dd3033888886818110610ac357610ac361163a565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b1a57600080fd5b505af1158015610b2e573d6000803e3d6000fd5b50505060028301805460009250610b4790600190611586565b81548110610b5757610b5761163a565b906000526020600020015490508083600201846003016000898987818110610b8157610b8161163a565b9050602002013581526020019081526020016000205481548110610ba757610ba761163a565b9060005260206000200181905550826003016000878785818110610bcd57610bcd61163a565b905060200201358152602001908152602001600020548360030160008381526020019081526020016000208190555082600201805480610c0f57610c0f611686565b60019003818190600052602060002001600090559055826003016000878785818110610c3d57610c3d61163a565b9050602002013581526020019081526020016000206000905560056000878785818110610c6c57610c6c61163a565b6020908102929092013583525081019190915260400160002080546001600160a01b03191690555080610c9e8161166d565b915050610a1c565b50604051838152339081907f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b29060200161081f565b6001600160a01b038116600090815260066020908152604091829020600201805483518184028101840190945280845260609392830182828015610d3e57602002820191906000526020600020905b815481526020019060010190808311610d2a575b50505050509050919050565b604080518082018252600080825260209182015281518083019092526003548252600454908201819052421115610e93576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de8919061169c565b90508015610e40576000826020015142610e029190611586565b9050600060085482610e14919061159f565b90508260095482610e25919061159f565b610e2f91906115c9565b8451610e3b91906115b6565b845250505b4260208381018290528351600381905560048390556040805193845291830184905282820152517f1f2d1a9fde053af46b5db3dc92a8aa8696e56a677998fdd1311b45be341f78539181900360600190a1505b90565b610e9e6110a1565b6001600160a01b038116610f035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f7565b610f0c816110fb565b50565b6040805180820182526003548152600480546020808401919091526001600160a01b0385811660009081526006909252848220845160025496516370a0823160e01b8152309581019590955292959093869291909116906370a0823190602401602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061169c565b9050836020015142118015610fc457508015155b15611017576000846020015142610fdb9190611586565b9050600060085482610fed919061159f565b90508260095482610ffe919061159f565b61100891906115c9565b61101290856115b6565b935050505b6001830154600954845461102c90859061159f565b61103691906115c9565b61104091906115eb565b9695505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261109c90849061114b565b505050565b6000546001600160a01b031633146109285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006111a0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661121d9092919063ffffffff16565b80519091501561109c57808060200190518101906111be91906116b5565b61109c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f7565b606061122c8484600085611234565b949350505050565b6060824710156112955760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f7565b600080866001600160a01b031685876040516112b191906116fb565b60006040518083038185875af1925050503d80600081146112ee576040519150601f19603f3d011682016040523d82523d6000602084013e6112f3565b606091505b50915091506113048783838761130f565b979650505050505050565b6060831561137e578251600003611377576001600160a01b0385163b6113775760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f7565b508161122c565b61122c83838151156113935781518083602001fd5b8060405162461bcd60e51b81526004016103f79190611717565b6001600160a01b0381168114610f0c57600080fd5b6000806000806000608086880312156113da57600080fd5b85356113e5816113ad565b945060208601356113f5816113ad565b935060408601359250606086013567ffffffffffffffff8082111561141957600080fd5b818801915088601f83011261142d57600080fd5b81358181111561143c57600080fd5b89602082850101111561144e57600080fd5b9699959850939650602001949392505050565b60006020828403121561147357600080fd5b813561147e816113ad565b9392505050565b60006020828403121561149757600080fd5b5035919050565b60008083601f8401126114b057600080fd5b50813567ffffffffffffffff8111156114c857600080fd5b6020830191508360208260051b85010111156114e357600080fd5b9250929050565b600080602083850312156114fd57600080fd5b823567ffffffffffffffff81111561151457600080fd5b6115208582860161149e565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561156457835183529284019291840191600101611548565b50909695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561159957611599611570565b92915050565b808202811582820484141761159957611599611570565b8082018082111561159957611599611570565b6000826115e657634e487b7160e01b600052601260045260246000fd5b500490565b818103600083128015838313168383128216171561160b5761160b611570565b5092915050565b808201828112600083128015821682158216171561163257611632611570565b505092915050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561166257600080fd5b815161147e816113ad565b60006001820161167f5761167f611570565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156116ae57600080fd5b5051919050565b6000602082840312156116c757600080fd5b8151801515811461147e57600080fd5b60005b838110156116f25781810151838201526020016116da565b50506000910152565b6000825161170d8184602087016116d7565b9190910192915050565b60208152600082518060208401526117368160408501602087016116d7565b601f01601f1916919091016040019291505056fea26469706673582212201b86d83e59ca776f1e678a3e16980aa887451b8537dcdda65d027e56c444748964736f6c63430008140033", + "072deb30545651ea6402bb5852883a5f37898eeaea": "60806040526004361015610018575b361561001657005b005b5f3560e01c806318ff57681461246b5780632ab5ac18146123275780632e0f2625146123055780633af32abf146122c85780633b692f52146121925780633b7d094614611eee57806342788ed914611e395780634396606b14611e0c57806354c42fdd14611db75780636118b15d1461015157806364a1d26814611d2b578063673a2a1f14611caa57806368d447f114611c1e578063715018a614611baf57806374dedf8414611ac35780637d538dca14611a6a57806382cf114c146119e55780638da5cb5b146119c05780639281aa0b1461191d5780639f793f0c14610e36578063a1291f7f14610df5578063bdfb57bc14610d21578063cd4b70b014610993578063eb511dd4146103b0578063ed768ff0146102b3578063f2fde38b14610200578063f434bb681461016f5763fa461e330361000e575b3461016b576100166101623661272e565b92919091612daf565b5f80fd5b3461016b575f60031936011261016b57604051806004549182815260208091019260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b8282106101e0576101dc856101d081890382612601565b604051918291826126ea565b0390f35b83546001600160a01b0316865294850194600193840193909101906101b9565b3461016b57602060031936011261016b57610219612557565b610221612f19565b6001600160a01b03809116908115610283575f54827fffffffffffffffffffffffff00000000000000000000000000000000000000008216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60246040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152fd5b3461016b57604060031936011261016b576102cc612557565b6001600160a01b03602435916102e0612f19565b16801561038657811561035c575f80809381935af13d15610357573d61030581612aa6565b906103136040519283612601565b81525f60203d92013e5b1561032d57602060405160018152f35b60046040517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b61031d565b60046040517f2c5211c6000000000000000000000000000000000000000000000000000000008152fd5b60046040517fe6c4247b000000000000000000000000000000000000000000000000000000008152fd5b3461016b57604060031936011261016b576103c9612557565b6103d161256d565b906001600160a01b035f54163314158061097c575b61094c576001600160a01b03168015610386576001600160a01b0382161561038657805f5260026020526001600160a01b0360405f20541615610922576001600160a01b0382165f5260036020526001600160a01b03600160405f200154166108f857805f5260026020526001600160a01b03600160405f20015416604051907f450efe210000000000000000000000000000000000000000000000000000000082526001600160a01b03841660048301525f82602481845afa918215610773575f926108d4575b506001600160a01b0384165f52600360205260405f20927fffffffffffffffffffffffff0000000000000000000000000000000000000000908185541617845560018401906001600160a01b038616908254161790556002830182519067ffffffffffffffff93848311610868576020906105298484612a6f565b01905f5260205f205f5b8381106108b757505050505f602491604051928380927ff429f19b0000000000000000000000000000000000000000000000000000000082526001600160a01b03891660048301525afa908115610773575f91610895575b508051918211610868576105a260038401546127fc565b601f811161082a575b50602090601f83116001146107bb5791806105de92600495945f926107b0575b50505f198260011b9260031b1c19161790565b60038201555b016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000082541617905561061881612d87565b6001600160a01b0381165f5260036020526001600160a01b03600160405f2001541615610786576001600160a01b0381165f52600360205260405f20906001600160a01b038254165f5260026020526001600160a01b03600360405f2001541680155f1461077e5750905b600281018054905f5b8281106106c2576004840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b8060206001600160a01b036106d85f9486612916565b90549060031b1c166044604051809581937f095ea7b30000000000000000000000000000000000000000000000000000000083526001600160a01b038c1660048401525f1960248401525af1801561077357610739575b600191500161068c565b6020823d60201161076b575b8161075260209383612601565b8101031261016b57610765600192612a62565b5061072f565b3d9150610745565b6040513d5f823e3d90fd5b905090610683565b60046040517fc7e8934f000000000000000000000000000000000000000000000000000000008152fd5b0151905086806105cb565b90600384015f5260205f20915f5b601f1985168110610812575091839160019383601f196004989716106107fa575b505050811b0160038201556105e4565b01515f1960f88460031b161c191690558580806107ea565b919260206001819286850151815501940192016107c9565b61085890600385015f5260205f20601f850160051c8101916020861061085e575b601f0160051c019061284d565b846105ab565b909150819061084b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6108b191503d805f833e6108a98183612601565b810190612ac2565b8461058b565b60019060206001600160a01b038551169401938184015501610533565b6108f19192503d805f833e6108e98183612601565b810190612b38565b90846104ae565b60046040517f03119322000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4607dda8000000000000000000000000000000000000000000000000000000008152fd5b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b50335f52600760205260ff60405f205416156103e6565b3461016b57604060031936011261016b576109ac612557565b6109b461256d565b6109bc612f19565b6001600160a01b0380831690811561038657815f526020600281528160405f205416610cf7576040517f1b4689bc0000000000000000000000000000000000000000000000000000000081528181600481875afa908115610773575f91610cc1575b506040517f06fdde030000000000000000000000000000000000000000000000000000000081525f81600481885afa908115610773575f91610ca7575b5060405191610a69836125ad565b85835283830195808752610a81604085019283612d7b565b606084019283528560808501981688525f52600284528460405f20935116957fffffffffffffffffffffffff000000000000000000000000000000000000000096878554161784556001918660018601925116825491516007811015610c7a5774ff00000000000000000000000000000000000000007fffffffffffffffffffffff0000000000000000000000000000000000000000009160a01b169216171790556002830191519081519167ffffffffffffffff831161086857610b4684546127fc565b601f8111610c4c575b508591601f8411600114610be1575060039550610b8192915f9183610bd65750505f198260011b9260031b1c19161790565b90555b0192511690825416179055600454906801000000000000000082101561086857610bb782600161001694016004556128ac565b9091906001600160a01b038084549260031b9316831b921b1916179055565b015190508a806105cb565b601f1984959697941690865f52845f20945f915b838310610c355750505091600193918560039897969410610c1e575b505050811b019055610b84565b01515f1960f884891b161c19169055898080610c11565b848601518755958601959481019491810191610bf5565b610c7490855f52875f20601f860160051c81019189871061085e57601f0160051c019061284d565b8a610b4f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610cbb91503d805f833e6108a98183612601565b87610a5b565b90508181813d8311610cf0575b610cd88183612601565b8101031261016b5751600781101561016b5786610a1e565b503d610cce565b60046040517fd559695b000000000000000000000000000000000000000000000000000000008152fd5b3461016b57610dad610d3236612780565b909392916001600160a01b038093165f52602094859360028552600160405f2001541691604051958694859384937f8de63b390000000000000000000000000000000000000000000000000000000085526004850191604091949360608401956001600160a01b039283809216865216602085015216910152565b03915afa908115610773575f91610dc8575b50604051908152f35b90508181813d8311610dee575b610ddf8183612601565b8101031261016b575182610dbf565b503d610dd5565b3461016b57606060031936011261016b576020610e2c610e13612557565b610e1b61256d565b610e23612f19565b60443591612f2c565b6040519015158152f35b3461016b5760c060031936011261016b5760043567ffffffffffffffff811161016b57610e679036906004016127cb565b60243567ffffffffffffffff811161016b57610e879036906004016127cb565b9260443567ffffffffffffffff811161016b57610ea89036906004016127cb565b93906064359060a4356001600160a01b035f541633141580611906575b61094c578784148015906118f2575b6118c857801561189e57431161187457851561184757610ef381612d22565b965f19870187811161107557610f0d610f12918985612d12565b612d22565b9183975f5b8681106110cc575060843589106110a2577f4d6e6c3e38a77ca3510970fc013a7aa5546181bb8d010887442faf41d9147f778787610f87610f788c88610f6a60405196879660a0885260a0880191612d36565b918583036020870152612d36565b82810360408401528587612d36565b8860608301528c60808301520390a1848903935f86128a86128116908b8713901516176110755760209a6001600160a01b03808316911614610fce575b8a8a604051908152f35b7f64d5f519b21f5c4a18ce0004081b0589de3ebf29bdcd98f414db525acba6224f986110359461102792875f8113611057575b505061101a6040519a8b9a60c08c5260c08c0191612d36565b918983038e8b0152612d36565b918683036040880152612d36565b91606084015285608084015260a08301520390a1828080808080808080610fc4565b61106d916001600160a01b036006541690612f2c565b508d87611001565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60046040517f830c0137000000000000000000000000000000000000000000000000000000008152fd5b986110db610f0d8b898b612d12565b6110e9610f0d8c878d612d12565b916110f8610f0d8d8688612d12565b60018d018d1161107557611113610f0d60018f018789612d12565b906001600160a01b0384165f52600260205260405f20946001600160a01b03600360405197611141896125ad565b82815416895261116660ff600183015485811660208d015260a01c1660408b01612d7b565b6040516111818161117a816002860161295c565b0382612601565b60608a015201541660808701526001600160a01b038651161561181d576001600160a01b0381165f5260036020526001600160a01b03600160405f200154161561130c575b6001600160a01b0381165f52600360205260407fa4c22cc2295555dbcae4fa95cfd1a20f38c94c07837e63cfd7ed146efb10b38861117a6112116003845f200184519283809261295c565b602081519101207f756e69737761707633000000000000000000000000000000000000000000000060208451611246816125c9565b6009815201521496876112d4575b0151946007861015610c7a5761126995612fe6565b906112a7575b984761127d57600101610f17565b60046040517f0c2b6a6c000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffff00000000000000000000000000000000000000006001541660015561126f565b6001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155611254565b6001600160a01b035f5416331415808091611806575b61094c57806117ef575b61094c576001600160a01b03851615610386576001600160a01b03811615610386576001600160a01b0385165f5260026020526001600160a01b0360405f20541615610922576001600160a01b0381165f5260036020526001600160a01b03600160405f200154166108f8576001600160a01b0385165f5260026020526001600160a01b03600160405f20015416604051907f450efe210000000000000000000000000000000000000000000000000000000082526001600160a01b03831660048301525f82602481845afa918215610773575f926117d3575b506001600160a01b0383165f52600360205260405f20917fffffffffffffffffffffffff00000000000000000000000000000000000000006001600160a01b0389168185541617845560018401906001600160a01b0386169082541617905580519067ffffffffffffffff8211610868576020906114878360028701612a6f565b01600284015f5260205f205f5b8381106117b657505050505f602491604051928380927ff429f19b0000000000000000000000000000000000000000000000000000000082526001600160a01b03881660048301525afa908115610773575f9161179c575b5080519067ffffffffffffffff82116108685761150c60038401546127fc565b90601f91828111611761575b5060209183116001146116f257918061154892600495945f926116e75750505f198260011b9260031b1c19161790565b60038201555b016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000082541617905561158281612d87565b6001600160a01b0381165f5260036020526001600160a01b03600160405f2001541615610786576001600160a01b0381165f52600360205260405f206001600160a01b038154165f5260026020526001600160a01b03600360405f2001541680155f146116e25750815b60028201545f5b81811061162e5750505060040160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556111c6565b8060206001600160a01b036116475f9460028901612916565b90549060031b1c166044604051809581937f095ea7b30000000000000000000000000000000000000000000000000000000083526001600160a01b038a1660048401525f1960248401525af18015610773576116a8575b60019150016115f3565b6020823d6020116116da575b816116c160209383612601565b8101031261016b576116d4600192612a62565b5061169e565b3d91506116b4565b6115ec565b015190505f806105cb565b90600384015f5260205f20915f5b601f1985168110611749575091839160019383601f19600498971610611731575b505050811b01600382015561154e565b01515f1960f88460031b161c191690555f8080611721565b91926020600181928685015181550194019201611700565b61178d90600386015f5260205f20600585808801821c83019360208910611793575b01901c019061284d565b5f611518565b93508293611783565b6117b091503d805f833e6108a98183612601565b5f6114ec565b60019060206001600160a01b038551169401938184015501611494565b6117e89192503d805f833e6108e98183612601565b905f611406565b50335f52600760205260ff60405f2054161561132c565b50335f52600760205260ff60405f20541615611322565b60046040517f743f26e1000000000000000000000000000000000000000000000000000000008152fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60046040517f59efd614000000000000000000000000000000000000000000000000000000008152fd5b60046040517f3c2112a3000000000000000000000000000000000000000000000000000000008152fd5b60046040517f666b2f97000000000000000000000000000000000000000000000000000000008152fd5b505f19870187811161107557841415610ed4565b50335f52600760205260ff60405f20541615610ec5565b3461016b57604060031936011261016b57611936612557565b6024359081151580920361016b576001600160a01b0390611955612f19565b169081156103865760207ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91835f526007825260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2005b3461016b575f60031936011261016b5760206001600160a01b035f5416604051908152f35b3461016b57602060031936011261016b576119fe612557565b611a06612f19565b6001600160a01b0380911690811561038657600654827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600655167f33d4e06fef66ea7b8720eecdf01790cd22cd367f39f64aa0fea7283339134b1e5f80a3005b3461016b57602060031936011261016b576001600160a01b03611a8b612557565b165f5260026020526101dc61117a611aaf600260405f20016040519283809261295c565b6040519182916020835260208301906126c5565b3461016b57608060031936011261016b57611adc612557565b611ae461256d565b90611aed612583565b606435611af8612f19565b6001600160a01b0380921693841561038657811561035c575f8360209560649460405198899788967f23b872dd00000000000000000000000000000000000000000000000000000000885216600487015260248601526044850152165af1908115610773575f91611b75575b501561032d57602060405160018152f35b90506020813d602011611ba7575b81611b9060209383612601565b8101031261016b57611ba190612a62565b81611b64565b3d9150611b83565b3461016b575f60031936011261016b57611bc7612f19565b5f6001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461016b57610dad611c2f36612780565b909392916001600160a01b038093165f52602094859360028552600160405f2001541691604051958694859384937fe95d46990000000000000000000000000000000000000000000000000000000085526004850191604091949360608401956001600160a01b039283809216865216602085015216910152565b3461016b575f60031936011261016b57604051806005549182815260208091019260055f527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0915f905b828210611d0b576101dc856101d081890382612601565b83546001600160a01b031686529485019460019384019390910190611cf4565b3461016b57610dad611d3c36612780565b909392916001600160a01b038093165f52602094859360028552600160405f2001541691604051958694859384937f7100d05c0000000000000000000000000000000000000000000000000000000085526004850191604091949360608401956001600160a01b039283809216865216602085015216910152565b3461016b5760a060031936011261016b57611dd0612557565b611dd861256d565b611de0612583565b916064356001600160a01b038116810361016b57602093611e049360843593612c61565b604051908152f35b3461016b57604060031936011261016b576101dc6101d0611e2b612557565b611e3361256d565b90612bba565b3461016b57604060031936011261016b57611e52612557565b5f611e5b61256d565b916001600160a01b03809116825260026020526024816001604085200154169360405194859384927ff429f19b0000000000000000000000000000000000000000000000000000000084521660048301525afa8015610773576101dc915f91611ed4575b506040519182916020835260208301906126c5565b611ee891503d805f833e6108a98183612601565b82611ebf565b3461016b5760208060031936011261016b57611f08612557565b6001600160a01b0390815f54163314158061217c575b61094c57811690811561038657815f5260039081845260019381600160405f200154161561078657835f5282815260405f2060405160c0810181811067ffffffffffffffff82111761086857604052838254168152836001830154168382015260a060ff6004611f9060028601612a0b565b9460408501958652604051611fab8161117a818d860161295c565b606086015201548181161515608085015260081c161515910152805151905f5b8281106120e45750505060045f9185835284815260408320908382558360018301556002820190815490858355816120cb575b50505061200c858201612863565b0155600591600554935f5b85811061202057005b818461202b836128e1565b905490861b1c161461203e578601612017565b9294505091809450545f19938482019182116110755761207093612064610bb7936128e1565b9054911b1c16916128e1565b8154801561209e57019061209b612086836128e1565b6001600160a01b0382549160031b1b19169055565b55005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b6120dc92865285209081019061284d565b878080611ffe565b8084866120f35f948651612948565b51166044604051809581937f095ea7b30000000000000000000000000000000000000000000000000000000083528d60048401525f1960248401525af1918215610773578992612145575b5001611fcb565b91508482813d8311612175575b61215c8183612601565b8101031261016b5761216e8992612a62565b508961213e565b503d612152565b50335f526007835260ff60405f20541615611f1e565b3461016b575f60031936011261016b576004546121ae81612624565b6121bb6040519182612601565b8181526121c782612624565b91601f1960209301835f5b8281106122b9575050505f5b8181106122635750506040519082820192808352815180945260408301938160408260051b8601019301915f955b8287106122195785850386f35b909192938280612253837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516126c5565b960192019601959291909261220c565b806001600160a01b036122776001936128ac565b90549060031b1c165f5261117a61229d600280885260405f20016040519283809261295c565b6122a78286612948565b526122b28185612948565b50016121de565b606085820183015281016121d2565b3461016b57602060031936011261016b576001600160a01b036122e9612557565b165f526007602052602060ff60405f2054166040519015158152f35b3461016b575f60031936011261016b576020604051670de0b6b3a76400008152f35b3461016b57608060031936011261016b5767ffffffffffffffff60043581811161016b5761235990369060040161263c565b9060249060243581811161016b5761237590369060040161263c565b9060443590811161016b5761238e90369060040161263c565b83518251811490811591612455575b506118c85790835191606435935f955b8487106123bf57602086604051908152f35b90919293946001600160a01b03806123d78985612948565b511690806123e58a89612948565b5116816123f28b89612948565b51169160018b01808c116124295791600195939161241461241c96948b612948565b511692612c61565b96019594939291906123ad565b877f4e487b71000000000000000000000000000000000000000000000000000000005f5260116004525ffd5b82515f198101925082116110755714158561239d565b3461016b57602060031936011261016b57612484612557565b61248c612f19565b6001600160a01b03809116801561038657805f5260026020528160405f2054161561092257805f52600260205260405f20915f83556001925f60018201556124d660028201612863565b5f600380920155600454925f5b8481106124ec57005b81846124f7836128ac565b905490861b1c161461250a5785016124e3565b9294505091506004545f19938482019182116110755761253c93612530610bb7936128ac565b9054911b1c16916128ac565b600454801561209e5701612552612086826128ac565b600455005b600435906001600160a01b038216820361016b57565b602435906001600160a01b038216820361016b57565b604435906001600160a01b038216820361016b57565b35906001600160a01b038216820361016b57565b60a0810190811067ffffffffffffffff82111761086857604052565b6040810190811067ffffffffffffffff82111761086857604052565b6060810190811067ffffffffffffffff82111761086857604052565b90601f601f19910116810190811067ffffffffffffffff82111761086857604052565b67ffffffffffffffff81116108685760051b60200190565b9080601f8301121561016b57602090823561265681612624565b936126646040519586612601565b81855260208086019260051b82010192831161016b57602001905b82821061268d575050505090565b83809161269984612599565b81520191019061267f565b5f5b8381106126b55750505f910152565b81810151838201526020016126a6565b90601f19601f6020936126e3815180928187528780880191016126a4565b0116010190565b60209060206040818301928281528551809452019301915f5b828110612711575050505090565b83516001600160a01b031685529381019392810192600101612703565b90606060031983011261016b57600435916024359160443567ffffffffffffffff9283821161016b578060238301121561016b57816004013593841161016b576024848301011161016b576024019190565b600319608091011261016b576001600160a01b0390600435828116810361016b5791602435818116810361016b5791604435828116810361016b5791606435908116810361016b5790565b9181601f8401121561016b5782359167ffffffffffffffff831161016b576020808501948460051b01011161016b57565b90600182811c92168015612843575b602083101461281657565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f169161280b565b818110612858575050565b5f815560010161284d565b61286d81546127fc565b9081612877575050565b81601f5f93116001146128895750555b565b9080839182526128a8601f60208420940160051c84016001850161284d565b5555565b6004548110156118475760045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905f90565b6005548110156118475760055f527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001905f90565b8054821015611847575f5260205f2001905f90565b8051156118475760200190565b8051600110156118475760400190565b80518210156118475760209160051b010190565b80545f939261296a826127fc565b918282526020936001916001811690815f146129ce5750600114612990575b5050505050565b90939495505f92919252835f2092845f945b8386106129ba57505050500101905f80808080612989565b8054858701830152940193859082016129a2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168685015250505090151560051b010191505f80808080612989565b90604051918281549182825260209260208301915f5260205f20935f905b828210612a3f5750505061288792500383612601565b85546001600160a01b031684526001958601958895509381019390910190612a29565b5190811515820361016b57565b9068010000000000000000811161086857815490808355818110612a9257505050565b612887925f5260205f20918201910161284d565b67ffffffffffffffff811161086857601f01601f191660200190565b60208183031261016b5780519067ffffffffffffffff821161016b570181601f8201121561016b578051612af581612aa6565b92612b036040519485612601565b8184526020828401011161016b57612b2191602080850191016126a4565b90565b51906001600160a01b038216820361016b57565b602090818184031261016b5780519067ffffffffffffffff821161016b57019180601f8401121561016b578251612b6e81612624565b93612b7c6040519586612601565b818552838086019260051b82010192831161016b578301905b828210612ba3575050505090565b838091612baf84612b24565b815201910190612b95565b906001600160a01b0380911690815f52600360205260405f209260ff600485015460081c16612c52575f929350811682526002602052600160408320015416916024604051809481937f450efe2100000000000000000000000000000000000000000000000000000000835260048301525afa908115610773575f91612c3e575090565b612b2191503d805f833e6108e98183612601565b5050506002612b219101612a0b565b6001600160a01b039081165f9081526002602090815260408083206001015490517fd7176ca9000000000000000000000000000000000000000000000000000000008152948416600486015294831660248501529482166044840152606483019590955290938492608492849291165af1908115610773575f91612ce3575090565b90506020813d602011612d0a575b81612cfe60209383612601565b8101031261016b575190565b3d9150612cf1565b91908110156118475760051b0190565b356001600160a01b038116810361016b5790565b9190808252602080920192915f5b828110612d52575050505090565b9091929382806001926001600160a01b03612d6c89612599565b16815201950193929101612d44565b6007821015610c7a5752565b600554906801000000000000000082101561086857610bb782600161288794016005556128e1565b9091600154906001600160a01b03928383163303612eef575f8113955f86138714612ec557826020918101031261016b576020945f94612e0f7fffffffffffffffffffffffff000000000000000000000000000000000000000094612599565b16968514612ebd5750915b166001556040517fa9059cbb00000000000000000000000000000000000000000000000000000000848201908152336024830152604480830193909352918152612e65606482612601565b519082855af115610773575f513d612eb45750803b155b612e835750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b60011415612e7c565b905091612e1a565b60046040517f70b71561000000000000000000000000000000000000000000000000000000008152fd5b60046040517f652b5561000000000000000000000000000000000000000000000000000000008152fd5b6001600160a01b035f5416330361094c57565b90916001600160a01b03918284161561038657811561035c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b039490941660048501526024840191909152602091839160449183915f91165af1908115610773575f91612fac575b501561032d57600190565b90506020813d602011612fde575b81612fc760209383612601565b8101031261016b57612fd890612a62565b5f612fa1565b3d9150612fba565b90949194610531461461301d5760046040517fd21eab37000000000000000000000000000000000000000000000000000000008152fd5b6007821015610c7a57816130a75750506040517fa9678a180000000000000000000000000000000000000000000000000000000081526001600160a01b0394851660048201529184166024830152919092166044830152606482015260208160848173553165b4e4295167f8f24731f8e93c5fee6c9c5a5af4908115610773575f91612ce3575090565b91939291600182036130be575050612b2193613bb7565b92939192600282036131465750506040517fa9678a180000000000000000000000000000000000000000000000000000000081526001600160a01b0394851660048201529184166024830152919092166044830152606482015260208160848173e0cd4fab32e5bda71ff994366d0b5165b69ee9fe5af4908115610773575f91612ce3575090565b919392916003820361315d575050612b2193613bb7565b600494929392918086036134dd57506001600160a01b03808094169416908482146134b457821561348b57831690604096848851917fd4dfadbf00000000000000000000000000000000000000000000000000000000835216878201526101008082602481875afa918215613481575f926133cd575b5050848151168083149081156133bd575b8161339d575b50156133755760800151918751956060870187811067ffffffffffffffff8211176133495789528652602086810192835286890193845288517f6e3b5a2e000000000000000000000000000000000000000000000000000000008152949392918590899082905afa93841561333f575f946132fc575b5060c493608096935f938780948c519b8c9a8b997f1440e604000000000000000000000000000000000000000000000000000000008b525116908901525116602487015251604486015283606486015260848501528260a4850152165af19182156132f357505f916132d0575090565b90506080813d6080116132eb575b81612cfe60809383612601565b3d91506132de565b513d5f823e3d90fd5b90959293506020813d602011613337575b8161331a60209383612601565b8101031261016b5751848116810361016b57919491929184613260565b3d915061330d565b88513d5f823e3d90fd5b6041897f4e487b71000000000000000000000000000000000000000000000000000000005f525260245ffd5b8688517f1e4f7d8c000000000000000000000000000000000000000000000000000000008152fd5b9050861480156133ae575b5f6131ea565b508460208201511686146133a8565b60208301518716841491506131e4565b9080925081813d831161347a575b6133e58183612601565b8101031261016b57885191820182811067ffffffffffffffff8211176133495761346e9160e0918b5261341781612b24565b845261342560208201612b24565b60208501526134358b8201613d90565b8b85015261344560608201613d90565b60608501526080810151608085015260a081015160a085015260c081015160c085015201612a62565b60e08201525f806131d3565b503d6133db565b89513d5f823e3d90fd5b856040517f43ad20fc000000000000000000000000000000000000000000000000000000008152fd5b856040517f672215de000000000000000000000000000000000000000000000000000000008152fd5b9194929392919050600581036134f8575050612b2193613bb7565b92949392600603613b17576001600160a01b038080931695168514613aef578215613ac75781841692604095865194613530866125e5565b600286526020958836888301378851927f0dfe1681000000000000000000000000000000000000000000000000000000009384815288818881875afa90811561392c575f91613a92575b50876135858461292b565b9116905289517fd21220a7000000000000000000000000000000000000000000000000000000009081815289818981885afa90811561396b575f91613a5d575b50886135d085612938565b911690528a51946135e0866125e5565b600286528b368b8801378b5190815289818981885afa801561396b575f90613a27575b61360d9150613d9e565b886136178761292b565b911690528a5190815288818881875afa90811561392c579087949392915f916139ec575b5061364590613d9e565b8861364f87612938565b911690528761365d8661292b565b5116036139b6578661366e8561292b565b5116988780613692816136808661292b565b51169461368c89612938565b50612938565b51169a5b16918b518a81806136e48b867f095ea7b3000000000000000000000000000000000000000000000000000000009b8c85528401602090939291936001600160a01b0360408201951681520152565b03815f885af180156139ac57908a9291613975575b5016938b51967f6e553f650000000000000000000000000000000000000000000000000000000088528888015230602488015289876044815f895af196871561396b57908c8b93925f99613936575b50519081526001600160a01b0390911688820190815260208101889052909190829081906040015b03815f885af1801561392c578b9493929189916138ea575b506137956137f19661292b565b5116149485156138ce575f6401000276a4915b8551948b8601528a85526137bb856125c9565b85517f128acb08000000000000000000000000000000000000000000000000000000008152968795869485938b308e8701613b55565b03925af19182156138c45761381e606493879695935f9384918593613893575b50841461388c5750613b8b565b93885197889586947fba087652000000000000000000000000000000000000000000000000000000008652850152306024850152306044850152165af19283156132f357505f9261386e57505090565b90809250813d8311613885575b612cfe8183612601565b503d61387b565b9050613b8b565b9092506138b691508b3d8d116138bd575b6138ae8183612601565b810190613b3f565b915f613811565b503d6138a4565b87513d5f823e3d90fd5b5f73fffd8963efd1fc6a506488495d951d5263988d25916137a8565b8095508a8092503d8311613925575b6139038183612601565b8101031261016b57876137956137f19661391d8e97612a62565b509650613788565b503d6138f9565b8b513d5f823e3d90fd5b929850509181813d8311613964575b61394f8183612601565b8101031261016b57519589918c613770613748565b503d613945565b8c513d5f823e3d90fd5b91508a82813d83116139a5575b61398c8183612601565b8101031261016b5761399e8a92612a62565b505f6136f9565b503d613982565b8d513d5f823e3d90fd5b866139c085612938565b51169887806139e4816139d286612938565b5116946139de8961292b565b5061292b565b51169a613696565b8095508a8092503d8311613a20575b613a058183612601565b8101031261016b57613645613a1a8895612b24565b9061363b565b503d6139fb565b508981813d8311613a56575b613a3d8183612601565b8101031261016b57613a5161360d91612b24565b613603565b503d613a33565b90508981813d8311613a8b575b613a748183612601565b8101031261016b57613a8590612b24565b5f6135c5565b503d613a6a565b90508881813d8311613ac0575b613aa98183612601565b8101031261016b57613aba90612b24565b5f61357a565b503d613a9f565b6040517f43ad20fc000000000000000000000000000000000000000000000000000000008152fd5b6040517f672215de000000000000000000000000000000000000000000000000000000008152fd5b6040517f743f26e1000000000000000000000000000000000000000000000000000000008152fd5b919082604091031261016b576020825192015190565b919360a093612b2196956001600160a01b03809416855215156020850152604084015216606082015281608082015201906126c5565b7f80000000000000000000000000000000000000000000000000000000000000008114611075575f0390565b6001600160a01b039493929185169185168214613d66578215613d3c578416906040918251957f0dfe16810000000000000000000000000000000000000000000000000000000087526020908188600481865afa978815613d32575f98613cee575b50905f85949392613c809916841496878214613cd3576401000276a4925b865195818701528552613c49856125c9565b8551998a95869485937f128acb080000000000000000000000000000000000000000000000000000000085528b3060048701613b55565b03925af1918215613cc957612b2193945f925f94613ca6575b50501561388c5750613b8b565b8091929450613cc19350903d106138bd576138ae8183612601565b915f80613c99565b50513d5f823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d2592613c37565b97509291908088813d8311613d2b575b613d088183612601565b8101031261016b575f8594613d1f613c809a612b24565b99509192939450613c19565b503d613cfe565b85513d5f823e3d90fd5b60046040517f43ad20fc000000000000000000000000000000000000000000000000000000008152fd5b60046040517f672215de000000000000000000000000000000000000000000000000000000008152fd5b519060ff8216820361016b57565b6001600160a01b038091604051907fa0c1f15e000000000000000000000000000000000000000000000000000000008252816004816020968794165afa80156107735783915f91613e5b575b506004604051809481937fb16a19de000000000000000000000000000000000000000000000000000000008352165afa918215610773575f92613e2c57505090565b90809250813d8311613e54575b613e438183612601565b8101031261016b57612b2190612b24565b503d613e39565b82819392503d8311613e8c575b613e728183612601565b8101031261016b5751818116810361016b5782905f613dea565b503d613e6856fea2646970667358221220d81d881b04c1ba048255683277c1709a40f87ae262af4c45090861d14978801364736f6c63430008180033", + "073ffeaf16afb4407ca99f87ed321ba0c41257db10": "", + "0763b9f25148ccc5337f0a889e8b3f0f8c9130c2fa": "", + "0775e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81": "608060405234801561000f575f80fd5b506004361061013d575f3560e01c80636352211e116100b4578063b88d4fde11610079578063b88d4fde146102a3578063c2aed302146102b6578063c87b56dd146102c9578063de4725cc146102dc578063e985e9c5146102ef578063f00b025514610302575f80fd5b80636352211e1461025a57806370a082311461026d5780638da5cb5b1461028057806395d89b4114610288578063a22cb46514610290575f80fd5b806323b872dd1161010557806323b872dd146101d45780632a55205a146101e75780632f745c591461021957806342842e0e1461022c5780634f6ccce71461023f5780635c4aead714610252575f80fd5b806301ffc9a71461014157806306fdde0314610169578063081812fc1461017e578063095ea7b3146101a957806318160ddd146101be575b5f80fd5b61015461014f3660046120c4565b610315565b60405190151581526020015b60405180910390f35b610171610381565b604051610160919061210d565b61019161018c36600461211f565b610410565b6040516001600160a01b039091168152602001610160565b6101bc6101b736600461214a565b610690565b005b6101c66107bc565b604051908152602001610160565b6101bc6101e2366004612174565b6108cf565b6101fa6101f53660046121b2565b610a5d565b604080516001600160a01b039093168352602083019190915201610160565b6101c661022736600461214a565b610eeb565b6101bc61023a366004612174565b610f2c565b6101c661024d36600461211f565b610f4b565b610171610f85565b61019161026836600461211f565b611011565b6101c661027b3660046121d2565b6111df565b610191611557565b610171611708565b6101bc61029e3660046121ed565b611717565b6101bc6102b1366004612294565b6117ec565b600b54610191906001600160a01b031681565b6101716102d736600461211f565b611803565b600a54610191906001600160a01b031681565b6101546102fd36600461233c565b611962565b600954610191906001600160a01b031681565b5f6001600160e01b0319821663152a902d60e11b148061034557506001600160e01b031982166301ffc9a760e01b145b8061036057506001600160e01b031982166380ac58cd60e01b145b8061037b57506001600160e01b03198216635b5e139f60e01b145b92915050565b60605f805461038f90612368565b80601f01602080910402602001604051908101604052809291908181526020018280546103bb90612368565b80156104065780601f106103dd57610100808354040283529160200191610406565b820191905f5260205f20905b8154815290600101906020018083116103e957829003601f168201915b5050505050905090565b5f8061044c604051806040016040528060088152602001671d1bdad95b97da5960c21b81525061044761044286611c24565b611cb4565b611cfa565b90505f61048561048060405180604001604052806009815260200168617070726f76616c7360b81b81525061044785611d2f565b611d2f565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d29906104bd90600890869060040161243e565b5f60405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104fe91908101906124bf565b600a546040516387cdf62160e01b81529192505f916001600160a01b03909116906387cdf621906105339085906004016124f9565b5f60405180830381865afa15801561054d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105749190810190612536565b80519091501561068557600a5481515f916001600160a01b0316906308d858e590849084906105a5576105a56125f7565b60200260200101516040518263ffffffff1660e01b81526004016105c9919061260b565b5f60405180830381865afa1580156105e3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261060a91908101906124bf565b600b54604051631778e53960e01b81529192506001600160a01b031690631778e5399061063b90849060040161210d565b602060405180830381865afa158015610656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067a9190612646565b979650505050505050565b505f95945050505050565b604080518082018252600781526639b832b73232b960c91b6020820152600b549151630c3c20ed60e01b81526001600160a01b0385811660048301525f9361072693926104479290911690630c3c20ed906024015b5f60405180830381865afa1580156106ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104429190810190612661565b90505f610759604051806040016040528060088152602001671d1bdad95b97da5960c21b81525061044761044286611c24565b90505f6107a961048060405180604001604052806007815260200166617070726f766560c81b8152506104476104808787604051806040016040528060018152602001600b60fa1b815250611d5f565b90506107b481611dab565b505050505050565b60095460408051808201825260118152707b226e756d5f746f6b656e73223a7b7d7d60781b602082015290516306d81d2960e01b81525f9283926001600160a01b03909116916306d81d2991610818916008919060040161243e565b5f60405180830381865afa158015610832573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261085991908101906124bf565b600a54604051632d2ac4c160e11b81529192506001600160a01b031690635a5589829061088a9084906004016126a6565b602060405180830381865afa1580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c991906126df565b91505090565b6001600160a01b0382166108fd57604051633250574960e11b81525f60048201526024015b60405180910390fd5b61090681611011565b6001600160a01b0316836001600160a01b0316146109665760405162461bcd60e51b815260206004820152601860248201527f6066726f6d60206d75737420626520746865206f776e6572000000000000000060448201526064016108f4565b60408051808201825260098152681c9958da5c1a595b9d60ba1b6020820152600b549151630c3c20ed60e01b81526001600160a01b0385811660048301525f936109c193926104479290911690630c3c20ed906024016106e5565b90505f6109f4604051806040016040528060088152602001671d1bdad95b97da5960c21b81525061044761044286611c24565b90505f610a496104806040518060400160405280600c81526020016b1d1c985b9cd9995c97db999d60a21b8152506104476104808787604051806040016040528060018152602001600b60fa1b815250611d5f565b9050610a5481611dab565b50505050505050565b5f805f60095f9054906101000a90046001600160a01b03166001600160a01b03166306d81d2960086040518060600160405280602c8152602001612a85602c91396040518363ffffffff1660e01b8152600401610abb92919061243e565b5f60405180830381865afa158015610ad5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610afc91908101906124bf565b600a546040516308d858e560e01b81529192505f916001600160a01b03909116906308d858e590610b319085906004016126f6565b5f60405180830381865afa158015610b4b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b7291908101906124bf565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc034818051906020012014610bda5760405163438c4bcb60e01b815260206004820152600c60248201526b726f79616c74795f696e666f60a01b60448201526064016108f4565b5f610c0b604051806040016040528060088152602001671d1bdad95b97da5960c21b8152506104476104428a611c24565b90505f610c406040518060400160405280600a81526020016973616c655f707269636560b01b8152506104476104428a611c24565b90505f610c956104806040518060400160405280600c81526020016b726f79616c74795f696e666f60a01b8152506104476104808787604051806040016040528060018152602001600b60fa1b815250611d5f565b90505f610ce86104806040518060400160405280600981526020016832bc3a32b739b4b7b760b91b815250610447610480604051806040016040528060038152602001626d736760e81b81525087611cfa565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d2990610d2090600890869060040161243e565b5f60405180830381865afa158015610d3a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d6191908101906124bf565b600a546040516308d858e560e01b81529192505f916001600160a01b03909116906308d858e590610d9690859060040161273a565b5f60405180830381865afa158015610db0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dd791908101906124bf565b600a54604051632d2ac4c160e11b81529192505f916001600160a01b0390911690635a55898290610e0c908690600401612775565b602060405180830381865afa158015610e27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4b91906126df565b905081515f03610e68575f9a509850610ee4975050505050505050565b600b54604051631778e53960e01b81526001600160a01b0390911690631778e53990610e9890859060040161210d565b602060405180830381865afa158015610eb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed79190612646565b9a50985050505050505050505b9250929050565b604051631d04569d60e21b81526020600482015260136024820152720e8ded6cadc9ecc9eeedccae484f292dcc8caf606b1b60448201525f906064016108f4565b610f4683838360405180602001604052805f8152506117ec565b505050565b604051631d04569d60e21b815260206004820152600c60248201526b0e8ded6cadc84f292dcc8caf60a31b60448201525f906064016108f4565b60088054610f9290612368565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbe90612368565b80156110095780601f10610fe057610100808354040283529160200191611009565b820191905f5260205f20905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b5f80611043604051806040016040528060088152602001671d1bdad95b97da5960c21b81525061044761044286611c24565b90505f6110766104806040518060400160405280600881526020016737bbb732b92fb7b360c11b81525061044785611d2f565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d29906110ae90600890869060040161243e565b5f60405180830381865afa1580156110c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ef91908101906124bf565b600a546040516308d858e560e01b81529192505f916001600160a01b03909116906308d858e5906111249085906004016127b7565b5f60405180830381865afa15801561113e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261116591908101906124bf565b600b54604051631778e53960e01b81529192506001600160a01b031690631778e5399061119690849060040161210d565b602060405180830381865afa1580156111b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190612646565b9695505050505050565b5f6001600160a01b038216611209576040516322718ad960e21b81525f60048201526024016108f4565b600b54604051630c3c20ed60e01b81526001600160a01b0384811660048301525f92606092849290911690630c3c20ed906024015f60405180830381865afa158015611257573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127e9190810190612661565b60405160200161128e9190612807565b60408051601f19818403018152908290526112ab91602001612831565b60405160208183030381529060405290505f7fcc1a5a473fb6da314e591eaff47c9e633c2fdb385df3a7900f90f8a3ce756bdd905060605f80846040516020016112f5919061284d565b60408051601f19818403018152908290526113129160200161286c565b60408051601f19818403018152908290526009546306d81d2960e01b83529092505f916001600160a01b03909116906306d81d299061135890600890869060040161243e565b5f60405180830381865afa158015611372573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261139991908101906124bf565b90505b80516020820120851461154957600a546040516387cdf62160e01b81526001600160a01b03909116906387cdf621906113d9908490600401612889565b5f60405180830381865afa1580156113f3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261141a9190810190612536565b8051909450925061142b83896128d7565b9750836114396001856128ea565b81518110611449576114496125f7565b602002602001015160405160200161146191906128fd565b60405160208183030381529060405296508587604051602001611485929190612920565b60408051601f19818403018152908290526114a29160200161284d565b60408051601f19818403018152908290526114bf9160200161286c565b60408051601f19818403018152908290526009546306d81d2960e01b83529093506001600160a01b0316906306d81d299061150190600890869060040161243e565b5f60405180830381865afa15801561151b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261154291908101906124bf565b905061139c565b509598975050505050505050565b5f806115a16104806040518060400160405280600981526020016806f776e6572736869760bc1b815250604051806040016040528060028152602001617b7d60f01b815250611cfa565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d29906115d990600890869060040161243e565b5f60405180830381865afa1580156115f3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161a91908101906124bf565b600a546040516308d858e560e01b81529192505f916001600160a01b03909116906308d858e59061164f9085906004016127b7565b5f60405180830381865afa158015611669573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261169091908101906124bf565b600b54604051631778e53960e01b81529192506001600160a01b031690631778e539906116c190849060040161210d565b602060405180830381865afa1580156116dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117009190612646565b935050505090565b60606001805461038f90612368565b604080518082018252600881526737b832b930ba37b960c11b6020820152600b549151630c3c20ed60e01b81526001600160a01b0385811660048301525f9361177493610480939092610447921690630c3c20ed906024016106e5565b905081156117ba576117b46117af6104806040518060400160405280600b81526020016a185c1c1c9bdd9957d85b1b60aa1b81525084611cfa565b611dab565b50505050565b6117b46117af6104806040518060400160405280600a8152602001691c995d9bdad957d85b1b60b21b81525084611cfa565b6117f78484846108cf565b6117b484848484611eaf565b606061180e82611011565b505f611840604051806040016040528060088152602001671d1bdad95b97da5960c21b81525061044761044286611c24565b90505f611873610480604051806040016040528060088152602001676e66745f696e666f60c01b81525061044785611d2f565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d29906118ab90600890869060040161243e565b5f60405180830381865afa1580156118c5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118ec91908101906124bf565b600a546040516308d858e560e01b81529192505f916001600160a01b03909116906308d858e590611921908590600401612934565b5f60405180830381865afa15801561193b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111d591908101906124bf565b604080518082018252600581526437bbb732b960d91b6020820152600b549151630c3c20ed60e01b81526001600160a01b0385811660048301525f9384936119ba939092610447921690630c3c20ed906024016106e5565b90505f6119f26104806040518060400160405280600d81526020016c616c6c5f6f70657261746f727360981b81525061044785611d2f565b6009546040516306d81d2960e01b81529192505f916001600160a01b03909116906306d81d2990611a2a90600890869060040161243e565b5f60405180830381865afa158015611a44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6b91908101906124bf565b600a546040516387cdf62160e01b81529192505f916001600160a01b03909116906387cdf62190611aa0908590600401612971565b5f60405180830381865afa158015611aba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ae19190810190612536565b90505f5b8151811015611c1757600a5482515f916001600160a01b0316906308d858e590859085908110611b1757611b176125f7565b60200260200101516040518263ffffffff1660e01b8152600401611b3b919061260b565b5f60405180830381865afa158015611b55573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b7c91908101906124bf565b600b54604051631778e53960e01b81529192506001600160a01b03808b1692911690631778e53990611bb290859060040161210d565b602060405180830381865afa158015611bcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190612646565b6001600160a01b031603611c0e576001965050505050505061037b565b50600101611ae5565b505f979650505050505050565b60605f611c3083611fd5565b60010190505f8167ffffffffffffffff811115611c4f57611c4f612228565b6040519080825280601f01601f191660200182016040528015611c79576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c8357509392505050565b606081604051602001611cc79190612831565b60408051601f1981840301815290829052611ce4916020016129ae565b6040516020818303038152906040529050919050565b6060611d28611d0884611cb4565b83604051806040016040528060018152602001601d60f91b815250611d5f565b9392505050565b606081604051602001611d4291906129c3565b60408051601f1981840301815290829052611ce4916020016129df565b6060838284604051602001611d75929190612920565b60408051601f1981840301815290829052611d939291602001612920565b60405160208183030381529060405290509392505050565b60605f806110026001600160a01b0316600885604051806040016040528060028152602001615b5d60f01b815250604051602401611deb939291906129f4565b60408051601f198184030181529181526020820180516001600160e01b031663226913d760e11b17905251611e209190612a2c565b5f60405180830381855af49150503d805f8114611e58576040519150601f19603f3d011682016040523d82523d5f602084013e611e5d565b606091505b509150915081611d285760405162461bcd60e51b815260206004820152601760248201527f436f736d5761736d2065786563757465206661696c656400000000000000000060448201526064016108f4565b6001600160a01b0383163b156117b457604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611ef1903390889087908790600401612a37565b6020604051808303815f875af1925050508015611f2b575060408051601f3d908101601f19168201909252611f2891810190612a69565b60015b611f92573d808015611f58576040519150601f19603f3d011682016040523d82523d5f602084013e611f5d565b606091505b5080515f03611f8a57604051633250574960e11b81526001600160a01b03851660048201526024016108f4565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611fce57604051633250574960e11b81526001600160a01b03851660048201526024016108f4565b5050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120135772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061203f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061205d57662386f26fc10000830492506010015b6305f5e1008310612075576305f5e100830492506008015b612710831061208957612710830492506004015b6064831061209b576064830492506002015b600a831061037b5760010192915050565b6001600160e01b0319811681146120c1575f80fd5b50565b5f602082840312156120d4575f80fd5b8135611d28816120ac565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611d2860208301846120df565b5f6020828403121561212f575f80fd5b5035919050565b6001600160a01b03811681146120c1575f80fd5b5f806040838503121561215b575f80fd5b823561216681612136565b946020939093013593505050565b5f805f60608486031215612186575f80fd5b833561219181612136565b925060208401356121a181612136565b929592945050506040919091013590565b5f80604083850312156121c3575f80fd5b50508035926020909101359150565b5f602082840312156121e2575f80fd5b8135611d2881612136565b5f80604083850312156121fe575f80fd5b823561220981612136565b91506020830135801515811461221d575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561226557612265612228565b604052919050565b5f67ffffffffffffffff82111561228657612286612228565b50601f01601f191660200190565b5f805f80608085870312156122a7575f80fd5b84356122b281612136565b935060208501356122c281612136565b925060408501359150606085013567ffffffffffffffff8111156122e4575f80fd5b8501601f810187136122f4575f80fd5b80356123076123028261226d565b61223c565b81815288602083850101111561231b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561234d575f80fd5b823561235881612136565b9150602083013561221d81612136565b600181811c9082168061237c57607f821691505b60208210810361239a57634e487b7160e01b5f52602260045260245ffd5b50919050565b80545f90600181811c908216806123b857607f821691505b6020821081036123d657634e487b7160e01b5f52602260045260245ffd5b818652602086018180156123f1576001811461240757612433565b60ff198516825283151560051b82019550612433565b5f878152602090205f5b8581101561242d57815484820152600190910190602001612411565b83019650505b505050505092915050565b604081525f61245060408301856123a0565b828103602084015261246281856120df565b95945050505050565b5f6124786123028461226d565b905082815283838301111561248b575f80fd5b8282602083015e5f602084830101529392505050565b5f82601f8301126124b0575f80fd5b611d288383516020850161246b565b5f602082840312156124cf575f80fd5b815167ffffffffffffffff8111156124e5575f80fd5b6124f1848285016124a1565b949350505050565b604081525f61250b60408301846120df565b82810360208401526009815268617070726f76616c7360b81b60208201526040810191505092915050565b5f60208284031215612546575f80fd5b815167ffffffffffffffff81111561255c575f80fd5b8201601f8101841361256c575f80fd5b805167ffffffffffffffff81111561258657612586612228565b8060051b6125966020820161223c565b918252602081840181019290810190878411156125b1575f80fd5b6020850192505b8383101561067a57825167ffffffffffffffff8111156125d6575f80fd5b6125e5896020838901016124a1565b835250602092830192909101906125b8565b634e487b7160e01b5f52603260045260245ffd5b604081525f61261d60408301846120df565b8281036020840152600781526639b832b73232b960c91b60208201526040810191505092915050565b5f60208284031215612656575f80fd5b8151611d2881612136565b5f60208284031215612671575f80fd5b815167ffffffffffffffff811115612687575f80fd5b8201601f81018413612697575f80fd5b6124f18482516020840161246b565b604081525f6126b860408301846120df565b8281036020840152600581526418dbdd5b9d60da1b60208201526040810191505092915050565b5f602082840312156126ef575f80fd5b5051919050565b604081525f61270860408301846120df565b8281036020840152601081526f726f79616c74795f7061796d656e747360801b60208201526040810191505092915050565b604081525f61274c60408301846120df565b828103602084015260078152666164647265737360c81b60208201526040810191505092915050565b604081525f61278760408301846120df565b8281036020840152600e81526d1c9bde585b1d1e57d85b5bdd5b9d60921b60208201526040810191505092915050565b604081525f6127c960408301846120df565b8281036020840152600581526437bbb732b960d91b60208201526040810191505092915050565b5f81518060208401855e5f93019283525090919050565b75113634b6b4ba111d18981818161137bbb732b9111d1160511b81525f611d2860168301846127f0565b5f61283c82846127f0565b601160f91b81526001019392505050565b6a7b22746f6b656e73223a7b60a81b81525f611d28600b8301846127f0565b5f61287782846127f0565b617d7d60f01b81526002019392505050565b604081525f61289b60408301846120df565b82810360208401526006815265746f6b656e7360d01b60208201526040810191505092915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561037b5761037b6128c3565b8181038181111561037b5761037b6128c3565b6e161139ba30b93a2fb0b33a32b9111d60891b81525f611d28600f8301846127f0565b5f6124f161292e83866127f0565b846127f0565b604081525f61294660408301846120df565b82810360208401526009815268746f6b656e5f75726960b81b60208201526040810191505092915050565b604081525f61298360408301846120df565b828103602084015260098152686f70657261746f727360b81b60208201526040810191505092915050565b601160f91b81525f611d2860018301846127f0565b5f6129ce82846127f0565b607d60f81b81526001019392505050565b607b60f81b81525f611d2860018301846127f0565b606081525f612a0660608301866123a0565b8281036020840152612a1881866120df565b905082810360408401526111d581856120df565b5f611d2882846127f0565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906111d5908301846120df565b5f60208284031215612a79575f80fd5b8151611d28816120ac56fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da2646970667358221220736bc33dbd02d64041e4a3e0cd89ed9c6b8ec5bc86a5e2cb545124b0969e344e64736f6c634300081a0033", + "079151434b16b9763660705744891fa906f660ecc5": "60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "07af37e8b6c9ed7f6318979f56fc287d76c30847ff": "608060405234801561001057600080fd5b50600436106102e95760003560e01c80637f2eecc311610191578063cf092995116100e3578063e3ee160e11610097578063ef55bec611610071578063ef55bec6146106f5578063f2fde38b14610708578063fbac39511461071b57600080fd5b8063e3ee160e14610688578063e94a01021461069b578063eaf9d194146106e257600080fd5b8063d9169487116100c8578063d916948714610608578063db006a751461062f578063dd62ed3e1461064257600080fd5b8063cf092995146105e2578063d505accf146105f557600080fd5b806396d6487911610145578063a457c2d71161011f578063a457c2d7146105a9578063a9059cbb146105bc578063b7b72899146105cf57600080fd5b806396d648791461054b5780639fd5a6cf1461056f578063a0cc6a681461058257600080fd5b806388b7ab631161017657806388b7ab63146105125780638da5cb5b1461052557806395d89b411461054357600080fd5b80637f2eecc3146104d85780638040a2c7146104ff57600080fd5b806323b872dd1161024a5780633c7c9b90116101fe57806370a08231116101d857806370a0823114610487578063715018a6146104bd5780637ecebe00146104c557600080fd5b80633c7c9b901461044e57806340c10f19146104615780635a049a701461047457600080fd5b8063313ce5671161022f578063313ce5671461041d5780633644e51514610433578063395093511461043b57600080fd5b806323b872dd146103f75780632b8c49e31461040a57600080fd5b806318160ddd116102a15780631a14f449116102865780631a14f4491461038b5780631e89d5451461039e578063232849c3146103b157600080fd5b806318160ddd1461036657806318bf50771461037857600080fd5b8063095ea7b3116102d2578063095ea7b31461032b5780630e27a3851461033e5780631624f6c61461035357600080fd5b806301ffc9a7146102ee57806306fdde0314610316575b600080fd5b6103016102fc36600461426e565b61073e565b60405190151581526020015b60405180910390f35b61031e6107d7565b60405161030d9190614417565b610301610339366004614122565b61088c565b61035161034c366004613ec2565b6108a2565b005b61035161036136600461430f565b610a3b565b6035545b60405190815260200161030d565b610351610386366004614122565b610b9d565b610351610399366004613ec2565b610ccb565b6103516103ac3660046141ed565b610dc0565b610163546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b610301610405366004613f0e565b610f0a565b610351610418366004614122565b610f99565b6101005460405160ff909116815260200161030d565b61036a6110bf565b610301610449366004614122565b6110c9565b61035161045c366004613ec2565b611112565b61035161046f366004614122565b61120a565b6103516104823660046141a0565b6112dd565b61036a610495366004613ec2565b73ffffffffffffffffffffffffffffffffffffffff1660009081526033602052604090205490565b610351611339565b61036a6104d3366004613ec2565b6113c6565b61036a7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b61035161050d366004613ec2565b6113f1565b610351610520366004613fb9565b6114e2565b60cc5473ffffffffffffffffffffffffffffffffffffffff166103d2565b61031e61157f565b610301610559366004613ec2565b60ff602081905260009182526040909120541681565b61035161057d366004613f49565b6115ac565b61036a7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b6103016105b7366004614122565b6115b9565b6103016105ca366004614122565b611691565b6103516105dd36600461414b565b61169e565b6103516105f0366004613fb9565b6116ae565b6103516106033660046140b9565b611737565b61036a7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b61035161063d366004614380565b61179d565b61036a610650366004613edc565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260346020908152604080832093909416825291909152205490565b61035161069636600461403c565b61187c565b6103016106a9366004614122565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815261010160209081526040808320938352929052205460ff1690565b6103516106f03660046142ae565b611974565b61035161070336600461403c565b611a5c565b610351610716366004613ec2565b611b3e565b610301610729366004613ec2565b60fe6020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f333319940000000000000000000000000000000000000000000000000000000014806107d157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b606061016480546107e7906144aa565b15905061087f5761016480546107fc906144aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610828906144aa565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b610887611c6e565b905090565b6000610899338484611c7d565b50600192915050565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314610928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260fe602052604090205460ff166109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f546574686572546f6b656e3a2075736572206973206e6f7420626c6f636b6564604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603360205260409020546109e78282611e30565b8173ffffffffffffffffffffffffffffffffffffffff167f6a2859ae7902313752498feb80a014e6e7275fe964c79aa965db815db1c7f1e982604051610a2f91815260200190565b60405180910390a25050565b600054610100900460ff1680610a54575060005460ff16155b610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff16158015610b1f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b61010080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416179055610b55612029565b610b5f848461214e565b610b6884612277565b8015610b9757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b6101635473ffffffffffffffffffffffffffffffffffffffff163314610c1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f6e6c79204f46542063616e2063616c6c000000000000000000000000000000604482015260640161091f565b610c2982826123de565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610c7191815260200190565b60405180910390a2604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907fde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04906020015b60405180910390a35050565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314610d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260fe602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f665918c9e02eb2fd85acca3969cb054fc84c138e60ec4af22ab6ef2fd4c93c279190a250565b828114610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f546574686572546f6b656e3a206d756c74695472616e73666572206d69736d6160448201527f7463680000000000000000000000000000000000000000000000000000000000606482015260840161091f565b60005b83811015610f0357610ef0858583818110610e96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610eab9190613ec2565b848484818110610ee4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135611691565b5080610efb816144f8565b915050610e52565b5050505050565b33600090815260fe602052604081205460ff1615610f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f426c6f636b65643a206d73672e73656e64657220697320626c6f636b65640000604482015260640161091f565b610f8f84848461250a565b90505b9392505050565b6101635473ffffffffffffffffffffffffffffffffffffffff16331461101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f6e6c79204f46542063616e2063616c6c000000000000000000000000000000604482015260640161091f565b6110258282611e30565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161106d91815260200190565b60405180910390a2604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907fb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd490602001610cbf565b60006108876125f0565b33600081815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161089991859061110d90869061444f565b611c7d565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260fe602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f406bbf2d8d145125adf1198d2cf8a67c66cc4bb0ab01c37dccd4f7c0aae1e7c79190a250565b60cc5473ffffffffffffffffffffffffffffffffffffffff16331461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b61129582826123de565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610a2f91815260200190565b60408051602081018490529081018290527fff0000000000000000000000000000000000000000000000000000000000000060f885901b166060820152610f03908690869060610160405160208183030381529060405261266a565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146113ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b6113c46000612770565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152609960205260408120546107d1565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b61016380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f140c7f3c4dd16fa102e8e866bdbed4553b3cbe199ca01455115be3efc7ec6b6290600090a250565b33600090815260fe602052604090205460ff161561155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f426c6f636b65643a206d73672e73656e64657220697320626c6f636b65640000604482015260640161091f565b61156b878787878787876127e7565b6115768787876128f8565b50505050505050565b6060610165805461158f906144aa565b1590506115a45761016580546107fc906144aa565b610887612bb6565b610f038585858585612bc5565b33600090815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120548281101561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161091f565b6116873385858403611c7d565b5060019392505050565b60006108993384846128f8565b6116a983838361266a565b505050565b33600090815260fe602052604090205460ff1615611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f426c6f636b65643a206d73672e73656e64657220697320626c6f636b65640000604482015260640161091f565b61156b87878787878787612d44565b6115768787878786868960405160200161178993929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612bc5565b60cc5473ffffffffffffffffffffffffffffffffffffffff16331461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b61184661184060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b82611e30565b6040518181527f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449060200160405180910390a150565b33600090815260fe602052604090205460ff16156118f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f426c6f636b65643a206d73672e73656e64657220697320626c6f636b65640000604482015260640161091f565b61195e89898989898988888b60405160200161194a93929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612d44565b6119698989896128f8565b505050505050505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146119f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b8151611a0990610164906020850190613d00565b508051611a1e90610165906020840190613d00565b507f90322812e6761e312b99024e89e7408714261709c6d7f874d796927e813a6f728282604051611a5092919061442a565b60405180910390a15050565b33600090815260fe602052604090205460ff1615611ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f426c6f636b65643a206d73672e73656e64657220697320626c6f636b65640000604482015260640161091f565b61195e89898989898988888b604051602001611b2a93929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b6040516020818303038152906040526127e7565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314611bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116611c62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161091f565b611c6b81612770565b50565b6060603680546107fc906144aa565b73ffffffffffffffffffffffffffffffffffffffff8316611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161091f565b73ffffffffffffffffffffffffffffffffffffffff8216611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161091f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8216611ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161091f565b611edf82600083612dcc565b73ffffffffffffffffffffffffffffffffffffffff821660009081526033602052604090205481811015611f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161091f565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603360205260408120838303905560358054849290611fd1908490614467565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600054610100900460ff1680612042575060005460ff16155b6120ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561210d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b612115612f24565b61211d613038565b8015611c6b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680612167575060005460ff16155b6121f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561223257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b61223a612f24565b6122448383613125565b80156116a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff1680612290575060005460ff16155b61231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561235b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b612363612f24565b6123a2826040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250613264565b6123ab82613398565b80156123da57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b73ffffffffffffffffffffffffffffffffffffffff821661245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161091f565b61246760008383612dcc565b8060356000828254612479919061444f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260336020526040812080548392906124b390849061444f565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006125178484846128f8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603460209081526040808320338452909152902054828110156125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606482015260840161091f565b6125e58533858403611c7d565b506001949350505050565b60006108877f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61261e6134d2565b6066546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b61267483836134e8565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff851691810191909152606081018390526126e99084906080015b6040516020818303038152906040528051906020012083613584565b73ffffffffffffffffffffffffffffffffffffffff831660008181526101016020908152604080832086845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518492917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050565b60cc805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff86163314612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546574686572546f6b656e3a20746f20213d206d73672e73656e646572000000604482015260640161091f565b6128728783868661363a565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff808a169282019290925290871660608201526080810186905260a0810185905260c0810184905260e081018390526128ee908890610100016126cd565b6115768783613716565b73ffffffffffffffffffffffffffffffffffffffff831661299b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161091f565b73ffffffffffffffffffffffffffffffffffffffff8216612a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161091f565b612a49838383612dcc565b73ffffffffffffffffffffffffffffffffffffffff831660009081526033602052604090205481811015612aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161091f565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260336020526040808220858503905591851681529081208054849290612b4390849061444f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ba991815260200190565b60405180910390a3610b97565b6060603780546107fc906144aa565b81421115612c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161091f565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9868686612c5e8a61379c565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810184905260e0016040516020818303038152906040528051906020012090506000612cc6826137d1565b9050612cd387828561383a565b612d39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015260640161091f565b611576878787611c7d565b612d508783868661363a565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808a169282019290925290871660608201526080810186905260a0810185905260c0810184905260e081018390526128ee908890610100016126cd565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260fe602052604090205460ff161580612e18575060cc5473ffffffffffffffffffffffffffffffffffffffff1633145b612e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f546574686572546f6b656e3a2066726f6d20697320626c6f636b656400000000604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff82163014156116a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f546574686572546f6b656e3a207472616e7366657220746f2074686520636f6e60448201527f7472616374206164647265737300000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1680612f3d575060005460ff16155b612fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561211d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790558015611c6b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680613051575060005460ff16155b6130dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561311c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b61211d33612770565b600054610100900460ff168061313e575060005460ff16155b6131ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561320957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b825161321c906036906020860190613d00565b508151613230906037906020850190613d00565b5080156116a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff168061327d575060005460ff16155b613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561334857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b825160208085019190912083519184019190912060659190915560665580156116a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff16806133b1575060005460ff16155b61343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091f565b600054610100900460ff1615801561347c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a5580156123da57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b60006134dc6107d7565b80519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526101016020908152604080832084845290915290205460ff16156123da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546574686572546f6b656e3a206175746820696e76616c696400000000000000604482015260640161091f565b6135d4836135ce6135936110bf565b856040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b8361383a565b6116a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546574686572546f6b656e3a20696e76616c6964207369676e61747572650000604482015260640161091f565b8142116136a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546574686572546f6b656e3a2061757468206561726c79000000000000000000604482015260640161091f565b80421061370c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546574686572546f6b656e3a2061757468206578706972656400000000000000604482015260640161091f565b610b9784846134e8565b73ffffffffffffffffffffffffffffffffffffffff821660008181526101016020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526099602052604090208054600181018255905b50919050565b60006107d16137de6125f0565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000833b613881578373ffffffffffffffffffffffffffffffffffffffff16613863848461388c565b73ffffffffffffffffffffffffffffffffffffffff16149050610f92565b610f8f848484613947565b6000815160411461391f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45435265636f7665723a20696e76616c6964207369676e6174757265206c656e60448201527f6774680000000000000000000000000000000000000000000000000000000000606482015260840161091f565b60208201516040830151606084015160001a61393d86828585613aa4565b9695505050505050565b60008060008573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b868660405160240161397e9291906143fe565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051613a0791906143e2565b600060405180830381855afa9150503d8060008114613a42576040519150601f19603f3d011682016040523d82523d6000602084013e613a47565b606091505b5091509150818015613a5b57506020815110155b801561393d575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090613a999083016020908101908401614256565b149695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115613b56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c75650000000000000000000000000000000000000000000000000000606482015260840161091f565b8360ff16601b14158015613b6e57508360ff16601c14155b15613bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c75650000000000000000000000000000000000000000000000000000606482015260840161091f565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015613c4f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116613cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015260640161091f565b95945050505050565b828054613d0c906144aa565b90600052602060002090601f016020900481019282613d2e5760008555613d74565b82601f10613d4757805160ff1916838001178555613d74565b82800160010185558215613d74579182015b82811115613d74578251825591602001919060010190613d59565b50613d80929150613d84565b5090565b5b80821115613d805760008155600101613d85565b803573ffffffffffffffffffffffffffffffffffffffff81168114613dbd57600080fd5b919050565b60008083601f840112613dd3578081fd5b50813567ffffffffffffffff811115613dea578182fd5b6020830191508360208260051b8501011115613e0557600080fd5b9250929050565b600082601f830112613e1c578081fd5b813567ffffffffffffffff80821115613e3757613e37614560565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613e7d57613e7d614560565b81604052838152866020858801011115613e95578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff81168114613dbd57600080fd5b600060208284031215613ed3578081fd5b610f9282613d99565b60008060408385031215613eee578081fd5b613ef783613d99565b9150613f0560208401613d99565b90509250929050565b600080600060608486031215613f22578081fd5b613f2b84613d99565b9250613f3960208501613d99565b9150604084013590509250925092565b600080600080600060a08688031215613f60578081fd5b613f6986613d99565b9450613f7760208701613d99565b93506040860135925060608601359150608086013567ffffffffffffffff811115613fa0578182fd5b613fac88828901613e0c565b9150509295509295909350565b600080600080600080600060e0888a031215613fd3578182fd5b613fdc88613d99565b9650613fea60208901613d99565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115614021578182fd5b61402d8a828b01613e0c565b91505092959891949750929550565b60008060008060008060008060006101208a8c03121561405a578182fd5b6140638a613d99565b985061407160208b01613d99565b975060408a0135965060608a0135955060808a0135945060a08a0135935061409b60c08b01613eb1565b925060e08a013591506101008a013590509295985092959850929598565b600080600080600080600060e0888a0312156140d3578081fd5b6140dc88613d99565b96506140ea60208901613d99565b9550604088013594506060880135935061410660808901613eb1565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614134578182fd5b61413d83613d99565b946020939093013593505050565b60008060006060848603121561415f578081fd5b61416884613d99565b925060208401359150604084013567ffffffffffffffff81111561418a578182fd5b61419686828701613e0c565b9150509250925092565b600080600080600060a086880312156141b7578283fd5b6141c086613d99565b9450602086013593506141d560408701613eb1565b94979396509394606081013594506080013592915050565b60008060008060408587031215614202578182fd5b843567ffffffffffffffff80821115614219578384fd5b61422588838901613dc2565b9096509450602087013591508082111561423d578384fd5b5061424a87828801613dc2565b95989497509550505050565b600060208284031215614267578081fd5b5051919050565b60006020828403121561427f578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f92578182fd5b600080604083850312156142c0578182fd5b823567ffffffffffffffff808211156142d7578384fd5b6142e386838701613e0c565b935060208501359150808211156142f8578283fd5b5061430585828601613e0c565b9150509250929050565b600080600060608486031215614323578081fd5b833567ffffffffffffffff8082111561433a578283fd5b61434687838801613e0c565b9450602086013591508082111561435b578283fd5b5061436886828701613e0c565b92505061437760408501613eb1565b90509250925092565b600060208284031215614391578081fd5b5035919050565b600081518084526143b081602086016020860161447e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516143f481846020870161447e565b9190910192915050565b828152604060208201526000610f8f6040830184614398565b602081526000610f926020830184614398565b60408152600061443d6040830185614398565b8281036020840152613cf78185614398565b6000821982111561446257614462614531565b500190565b60008282101561447957614479614531565b500390565b60005b83811015614499578181015183820152602001614481565b83811115610b975750506000910152565b600181811c908216806144be57607f821691505b602082108114156137cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561452a5761452a614531565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220b63ccc36ce0285e12c6580ef5c2f12a86f8c0ab88a1ed9d34ef996133e48427a64736f6c63430008040033", + "07b243320bcf9c95db7f74108b6773b8f4dc3adaf5": "608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f4314610800578063f305839914610820578063f30dba9314610828578063f637731d146108aa576101ae565b8063c45a0155146107d1578063d0c93a7c146107d9578063d21220a7146107f8576101ae565b8063883bdbfd116100c8578063883bdbfd14610633578063a34123a71461073c578063a38807f214610776576101ae565b806370cf754a146105c65780638206a4d1146105ce57806385b66729146105f6576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146104705780634f1eb3d8146104fc578063514ea4bf1461054d5780635339c296146105a6576101ae565b80633850c7bd1461035b5780633c8a7d8d146103b45780634614131914610456576101ae565b80631ad8b03b1161018c5780631ad8b03b146102aa578063252c09d7146102e157806332148f6714610338576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610286575b600080fd5b6101bb6108d0565b604080516001600160a01b039092168252519081900360200190f35b61026d600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a08101608082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b5090925090506108f4565b6040805192835260208301919091528051918290030190f35b61028e6114ad565b604080516001600160801b039092168252519081900360200190f35b6102b26114bc565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fe600480360360208110156102f757600080fd5b50356114d6565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103596004803603602081101561034e57600080fd5b503561ffff1661151c565b005b610363611616565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b61026d600480360360a08110156103ca57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a08101608082013564010000000081111561041757600080fd5b82018360208201111561042957600080fd5b8035906020019184600183028401116401000000008311171561044b57600080fd5b509092509050611666565b61045e611922565b60408051918252519081900360200190f35b6103596004803603608081101561048657600080fd5b6001600160a01b0382351691602081013591604082013591908101906080810160608201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111640100000000831117156104f157600080fd5b509092509050611928565b6102b2600480360360a081101561051257600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611d83565b61056a6004803603602081101561056357600080fd5b5035611f9d565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045e600480360360208110156105bc57600080fd5b503560010b611fda565b61028e611fec565b610359600480360360408110156105e457600080fd5b5060ff81358116916020013516612010565b6102b26004803603606081101561060c57600080fd5b506001600160a01b03813516906001600160801b036020820135811691604001351661220f565b6106a36004803603602081101561064957600080fd5b81019060208101813564010000000081111561066457600080fd5b82018360208201111561067657600080fd5b8035906020019184602083028401116401000000008311171561069857600080fd5b5090925090506124dc565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e75781810151838201526020016106cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561072657818101518382015260200161070e565b5050505090500194505050505060405180910390f35b61026d6004803603606081101561075257600080fd5b508035600290810b91602081013590910b90604001356001600160801b0316612569565b6107a06004803603604081101561078c57600080fd5b508035600290810b9160200135900b6126e0565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b6101bb6128d7565b6107e16128fb565b6040805160029290920b8252519081900360200190f35b6101bb61291f565b610808612943565b6040805162ffffff9092168252519081900360200190f35b61045e612967565b6108486004803603602081101561083e57600080fd5b503560020b61296d565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610359600480360360208110156108c057600080fd5b50356001600160a01b03166129db565b7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc581565b6000806108ff612bf0565b85610936576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526109ef576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a3a5780600001516001600160a01b0316866001600160a01b0316118015610a35575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a6c565b80600001516001600160a01b0316866001600160a01b0316108015610a6c57506401000276a36001600160a01b038716115b610aa3576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610ad25760048460a0015160ff16901c610ae5565b60108460a0015160ff1681610ae357fe5b065b60ff1681526004546001600160801b03166020820152604001610b06612c27565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8257600254610b86565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd55750886001600160a01b031681604001516001600160a01b031614155b15610f9f57610be261560e565b60408201516001600160a01b031681526060820151610c25906006907f000000000000000000000000000000000000000000000000000000000000003c8f612c2b565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5657620d89e7196020820152610c75565b6020810151620d89e860029190910b1315610c7557620d89e860208201525b610c828160200151612d6d565b6001600160a01b031660608201526040820151610d13908d610cbc578b6001600160a01b031683606001516001600160a01b031611610cd6565b8b6001600160a01b031683606001516001600160a01b0316105b610ce4578260600151610ce6565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000bb861309f565b60c085015260a084015260808301526001600160a01b031660408301528215610d7557610d498160c00151826080015101613291565b825103825260a0810151610d6b90610d6090613291565b6020840151906132a7565b6020830152610db0565b610d828160a00151613291565b825101825260c08101516080820151610daa91610d9f9101613291565b6020840151906132c3565b60208301525b835160ff1615610df6576000846000015160ff168260c0015181610dd057fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3557610e298160c00151600160801b8460c001516001600160801b03166132d9565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f5e57806040015115610f35578360a00151610ebf57610e9d846040015160008760200151886040015188602001518a606001516008613389909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f0b82602001518e610ed657600154610edc565b84608001515b8f610eeb578560800151610eef565b6002545b608089015160608a015160408b0151600595949392919061351c565b90508c15610f17576000035b610f258360c00151826135ef565b6001600160801b031660c0840152505b8b610f44578060200151610f4d565b60018160200151035b600290810b900b6060830152610f99565b80600001516001600160a01b031682604001516001600160a01b031614610f9957610f8c82604001516136a5565b600290810b900b60608301525b50610baf565b836020015160020b816060015160020b1461107a57600080610fed86604001518660400151886020015188602001518a606001518b6080015160086139d1909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110ac9050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110f25760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561114257608081015160015560a08101516001600160801b03161561113d5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b611188565b608081015160025560a08101516001600160801b0316156111885760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146111a157602081015181518b036111ae565b80600001518a0381602001515b90965094508a156112e75760008512156111f0576111f07f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c78d87600003613b86565b60006111fa613cd4565b9050336001600160a01b0316636118b15d88888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561127e57600080fd5b505af1158015611292573d6000803e3d6000fd5b5050505061129e613cd4565b6112a88289613e0d565b11156112e1576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b50611411565b600086121561131e5761131e7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc58d88600003613b86565b6000611328613e1d565b9050336001600160a01b0316636118b15d88888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506113cc613e1d565b6113d68288613e0d565b111561140f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff81106114e757600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff16611560576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611575612bf0565b60008054600160d81b900461ffff169061159160088385613eb5565b6000805461ffff808416600160d81b810261ffff60d81b19909316929092179092559192508316146115fe576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff166116ad576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b0385166116cd57600080fd5b60008061171b60405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b81526020016117118a6001600160801b0316613f58565b600f0b9052613f69565b9250925050819350809250600080600086111561173d5761173a613cd4565b91505b841561174e5761174b613e1d565b90505b336001600160a01b031663b27ef48e87878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050600086111561183b576117f9613cd4565b6118038388613e0d565b111561183b576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b841561188b57611849613e1d565b6118538287613e0d565b111561188b576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff1661196c576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611981612bf0565b6004546001600160801b0316806119c3576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b60006119f8867f0000000000000000000000000000000000000000000000000000000000000bb862ffffff16620f42406141a9565b90506000611a2f867f0000000000000000000000000000000000000000000000000000000000000bb862ffffff16620f42406141a9565b90506000611a3b613cd4565b90506000611a47613e1d565b90508815611a7a57611a7a7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc58b8b613b86565b8715611aab57611aab7f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c78b8a613b86565b336001600160a01b0316637eee804185858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b2d57600080fd5b505af1158015611b41573d6000803e3d6000fd5b505050506000611b4f613cd4565b90506000611b5b613e1d565b905081611b688588613e0d565b1115611ba0576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611bab8487613e0d565b1115611be3576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611c725760008054600160e81b9004600f16908115611c16578160ff168481611c1057fe5b04611c19565b60005b90506001600160801b03811615611c4c57600380546001600160801b038082168401166001600160801b03199091161790555b611c66818503600160801b8d6001600160801b03166132d9565b60018054909101905550505b8015611cfd5760008054600160e81b900460041c600f16908115611ca2578160ff168381611c9c57fe5b04611ca5565b60005b90506001600160801b03811615611cd757600380546001600160801b03600160801b8083048216850182160291161790555b611cf1818403600160801b8d6001600160801b03166132d9565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611dca576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611de460073389896141e3565b60038101549091506001600160801b0390811690861611611e055784611e14565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e3c5783611e52565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611eb7576003810180546001600160801b031981166001600160801b03918216869003821617909155611eb7907f0000000000000000000000009151434b16b9763660705744891fa906f660ecc5908a908616613b86565b6001600160801b03821615611f1d576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f1d907f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c7908a908516613b86565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06281565b600054600160f01b900460ff16612054576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df41691638da5cb5b916004808301926020929190829003018186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d60208110156120eb57600080fd5b50516001600160a01b0316331461210157600080fd5b60ff82161580612124575060048260ff16101580156121245750600a8260ff1611155b801561214e575060ff8116158061214e575060048160ff161015801561214e5750600a8160ff1611155b61215757600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff16612256576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df41691638da5cb5b916004808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b50516001600160a01b0316331461230357600080fd5b6003546001600160801b039081169085161161231f578361232c565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116123525782612366565b600354600160801b90046001600160801b03165b90506001600160801b038216156123e7576003546001600160801b038381169116141561239557600019909101905b600380546001600160801b031981166001600160801b039182168590038216179091556123e7907f0000000000000000000000009151434b16b9763660705744891fa906f660ecc59087908516613b86565b6001600160801b0381161561246d576003546001600160801b03828116600160801b90920416141561241857600019015b600380546001600160801b03600160801b80830482168590038216029181169190911790915561246d907f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c79087908416613b86565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806124e7612bf0565b61255e6124f2612c27565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614247565b915091509250929050565b600080548190600160f01b900460ff166125b0576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061260990606081016125fc6001600160801b038a16613f58565b600003600f0b9052613f69565b925092509250816000039450806000039350600085118061262a5750600084115b15612669576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006126ed612bf0565b6126f785856143a1565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b9367010000000000000082046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061275f57600080fd5b6003820154600681900b985067010000000000000081046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806127a457600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b1215905061284d575093909403965090039350900390506128d0565b8a60020b816020015160020b12156128c1576000612869612c27565b602083015160408401516004546060860151939450600093849361289f936008938893879392916001600160801b031690613389565b9a9003989098039b5050949096039290920396509091030392506128d0915050565b50949093039650039350900390505b9250925092565b7f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df481565b7f000000000000000000000000000000000000000000000000000000000000003c81565b7f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c781565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b9067010000000000000081046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a1e576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a29826136a5565b9050600080612a41612a39612c27565b60089061446a565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b73ffffffffffffffffffffffffffffffffffffffff19909116871762ffffff60a01b1916600160a01b62ffffff9787900b9790971696909602959095177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9091021761ffff60d81b1916600160d81b909602959095177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612b9957fe5b05029050600083600281900b620d89e881612bb057fe5b0502905060008460020b83830360020b81612bc757fe5b0560010190508062ffffff166001600160801b03801681612be457fe5b0493505050505b919050565b306001600160a01b037f000000000000000000000000b243320bcf9c95db7f74108b6773b8f4dc3adaf51614612c2557600080fd5b565b4290565b60008060008460020b8660020b81612c3f57fe5b05905060008660020b128015612c6657508460020b8660020b81612c5f57fe5b0760020b15155b15612c7057600019015b8315612ce557600080612c82836144b6565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612cc757888360ff16860302612cda565b88612cd1826144c8565b840360ff168603025b965050505050612d63565b600080612cf4836001016144b6565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d4657888360ff0360ff16866001010102612d5c565b8883612d5183614568565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612d84578260020b612d8c565b8260020b6000035b9050620d89e8811115612dca576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612dde57600160801b612df0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e24576ffff97272373d413259a46990580e213a0260801c5b6004821615612e43576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e62576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e81576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ea0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ebf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ede576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612efe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612f9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fbe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fde576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612fff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561301f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561303e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561305b576b048a170391f7dc42444e8fa20260801c5b60008460020b131561307657806000198161307257fe5b0490505b64010000000081061561308a57600161308d565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131245760006130d88989620f42400362ffffff16620f42406132d9565b9050826130f1576130ec8c8c8c6001614652565b6130fe565b6130fe8b8d8c60016146cd565b955085811061310f578a965061311e565b61311b8c8b838661478a565b96505b5061316e565b8161313b576131368b8b8b60006146cd565b613148565b6131488a8c8b6000614652565b935083886000031061315c5789955061316e565b61316b8b8a8a600003856147d6565b95505b6001600160a01b038a81169087161482156131d15780801561318d5750815b6131a35761319e878d8c60016146cd565b6131a5565b855b95508080156131b2575081155b6131c8576131c3878d8c6000614652565b6131ca565b845b945061321b565b8080156131db5750815b6131f1576131ec8c888c6001614652565b6131f3565b855b9550808015613200575081155b613216576132118c888c60006146cd565b613218565b845b94505b8115801561322b57508860000385115b15613237578860000394505b81801561325657508a6001600160a01b0316876001600160a01b031614155b15613265578589039350613282565b61327f868962ffffff168a620f42400362ffffff166141a9565b93505b50505095509550955095915050565b6000600160ff1b82106132a357600080fd5b5090565b808203828113156000831215146132bd57600080fd5b92915050565b818101828112156000831215146132bd57600080fd5b600080806000198587098686029250828110908390030390508061330f576000841161330457600080fd5b508290049050613382565b80841161331b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613430576000898661ffff1661ffff81106133aa57fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461341c57613419818a8988614822565b90505b806020015181604001519250925050613510565b8688036000806134458c8c858c8c8c8c6148d2565b91509150816000015163ffffffff168363ffffffff161415613477578160200151826040015194509450505050613510565b805163ffffffff8481169116141561349f578060200151816040015194509450505050613510565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816134cd57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816134ff57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b036701000000000000008085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561365457826001600160801b03168260000384039150816001600160801b03161061364f576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6132bd565b826001600160801b03168284019150816001600160801b031610156132bd576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906136e1575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613716576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106137b757607f810383901c91506137c1565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146139c257886001600160a01b03166139a682612d6d565b6001600160a01b031611156139bb57816139bd565b805b6139c4565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106139e757fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a575788859250925050613510565b8461ffff168461ffff16118015613a7857506001850361ffff168961ffff16145b15613a8557839150613a89565b8491505b8161ffff168960010161ffff1681613a9d57fe5b069250613aac81898989614822565b8a8461ffff1661ffff8110613abd57fe5b825191018054602084015160408501516060909501511515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16640100000000026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c025780518252601f199092019160209182019101613be3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c64576040519150601f19603f3d011682016040523d82523d6000602084013e613c69565b606091505b5091509150818015613c97575080511580613c975750808060200190516020811015613c9457600080fd5b50515b613ccd576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f0000000000000000000000009151434b16b9763660705744891fa906f660ecc51693919290918291908083835b60208310613d6d5780518252601f199092019160209182019101613d4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dcd576040519150601f19603f3d011682016040523d82523d6000602084013e613dd2565b606091505b5091509150818015613de657506020815110155b613def57600080fd5b808060200190516020811015613e0457600080fd5b50519250505090565b808201828110156132bd57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000e30fedd158a2e3b13e9badaeabafc5516e95e8c716939192909182919080838360208310613d6d5780518252601f199092019160209182019101613d4e565b6000808361ffff1611613ef3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f09575081613382565b825b8261ffff168161ffff161015613f4f576001858261ffff1661ffff8110613f2e57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f0b565b50909392505050565b80600f81900b8114612beb57600080fd5b6000806000613f76612bf0565b613f88846020015185604001516143a1565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c08501528851908901519489015192890151939461402c9491939092909190614acf565b93508460600151600f0b6000146141a157846020015160020b816020015160020b12156140815761407a6140638660200151612d6d565b6140708760400151612d6d565b8760600151614c84565b92506141a1565b846040015160020b816020015160020b12156141775760045460408201516001600160801b03909116906140d3906140b7612c27565b60208501516060860151608087015160089493929187916139d1565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151614123919061411990612d6d565b8860600151614c84565b93506141416141358760200151612d6d565b83516060890151614cc8565b92506141518187606001516135ef565b600480546001600160801b0319166001600160801b0392909216919091179055506141a1565b61419e6141878660200151612d6d565b6141948760400151612d6d565b8760600151614cc8565b91505b509193909250565b60006141b68484846132d9565b9050600082806141c257fe5b84860911156133825760001981106141d957600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff1611614287576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff8111801561429f57600080fd5b506040519080825280602002602001820160405280156142c9578160200160208202803683370190505b509150865167ffffffffffffffff811180156142e457600080fd5b5060405190808252806020026020018201604052801561430e578160200160208202803683370190505b50905060005b87518110156143945761433f8a8a8a848151811061432e57fe5b60200260200101518a8a8a8a613389565b84838151811061434b57fe5b6020026020010184848151811061435e57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614314565b5097509795505050505050565b8060020b8260020b126143e1576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614424576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614466576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b60008082116144d657600080fd5b600160801b82106144e957608091821c91015b68010000000000000000821061450157604091821c91015b640100000000821061451557602091821c91015b62010000821061452757601091821c91015b610100821061453857600891821c91015b6010821061454857600491821c91015b6004821061455857600291821c91015b60028210612beb57600101919050565b600080821161457657600080fd5b5060ff6001600160801b0382161561459157607f1901614599565b608082901c91505b67ffffffffffffffff8216156145b257603f19016145ba565b604082901c91505b63ffffffff8216156145cf57601f19016145d7565b602082901c91505b61ffff8216156145ea57600f19016145f2565b601082901c91505b60ff821615614604576007190161460c565b600882901c91505b600f82161561461e5760031901614626565b600482901c91505b60038216156146385760011901614640565b600282901c91505b6001821615612beb5760001901919050565b6000836001600160a01b0316856001600160a01b03161115614672579293925b8161469f5761469a836001600160801b03168686036001600160a01b0316600160601b6132d9565b6146c2565b6146c2836001600160801b03168686036001600160a01b0316600160601b6141a9565b90505b949350505050565b6000836001600160a01b0316856001600160a01b031611156146ed579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661472957600080fd5b8361475957866001600160a01b031661474c8383896001600160a01b03166132d9565b8161475357fe5b0461477f565b61477f6147708383896001600160a01b03166141a9565b886001600160a01b0316614cf7565b979650505050505050565b600080856001600160a01b0316116147a157600080fd5b6000846001600160801b0316116147b757600080fd5b816147c95761469a8585856001614d02565b6146c28585856001614de3565b600080856001600160a01b0316116147ed57600080fd5b6000846001600160801b03161161480357600080fd5b816148155761469a8585856000614de3565b6146c28585856000614d02565b61482a61564a565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b03161161487e576001614880565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148ab57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b6148da61564a565b6148e261564a565b888561ffff1661ffff81106148f357fe5b60408051608081018252919092015463ffffffff81168083526401000000008204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061495890899089614ed8565b15614990578663ffffffff16826000015163ffffffff16141561497a57613510565b8161498783898988614822565b91509150613510565b888361ffff168660010161ffff16816149a557fe5b0661ffff1661ffff81106149b557fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a6c57604080516080810182528a5463ffffffff811682526401000000008104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614a7b88836000015189614ed8565b614ab2576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614abf8989898887614f9b565b9150915097509795505050505050565b6000614ade60078787876141e3565b60015460025491925090600080600f87900b15614c24576000614aff612c27565b6000805460045492935090918291614b499160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613389565b9092509050614b8360058d8b8d8b8b87898b60007f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06261513b565b9450614bba60058c8b8d8b8b87898b60017f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06261513b565b93508415614bee57614bee60068d7f000000000000000000000000000000000000000000000000000000000000003c615325565b8315614c2057614c2060068c7f000000000000000000000000000000000000000000000000000000000000003c615325565b5050505b600080614c3660058c8c8b8a8a61538b565b9092509050614c47878a8484615437565b600089600f0b1215614c75578315614c6457614c6460058c6155cc565b8215614c7557614c7560058b6155cc565b50505050505095945050505050565b60008082600f0b12614caa57614ca5614ca085858560016146cd565b613291565b6146c5565b614cbd614ca085858560000360006146cd565b600003949350505050565b60008082600f0b12614ce457614ca5614ca08585856001614652565b614cbd614ca08585856000036000614652565b808204910615150190565b60008115614d755760006001600160a01b03841115614d3857614d3384600160601b876001600160801b03166132d9565b614d50565b6001600160801b038516606085901b81614d4e57fe5b045b9050614d6d614d686001600160a01b03881683613e0d565b6155f8565b9150506146c5565b60006001600160a01b03841115614da357614d9e84600160601b876001600160801b03166141a9565b614dba565b614dba606085901b6001600160801b038716614cf7565b905080866001600160a01b031611614dd157600080fd5b6001600160a01b0386160390506146c5565b600082614df15750836146c5565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614e91576001600160a01b03861684810290858281614e3157fe5b041415614e6257818101828110614e6057614e5683896001600160a01b0316836141a9565b93505050506146c5565b505b614e8882614e83878a6001600160a01b03168681614e7c57fe5b0490613e0d565b614cf7565b925050506146c5565b6001600160a01b03861684810290858281614ea857fe5b04148015614eb557508082115b614ebe57600080fd5b808203614e56614d68846001600160a01b038b16846141a9565b60008363ffffffff168363ffffffff1611158015614f0257508363ffffffff168263ffffffff1611155b15614f1e578163ffffffff168363ffffffff1611159050613382565b60008463ffffffff168463ffffffff1611614f46578363ffffffff1664010000000001614f4e565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614f7f578363ffffffff1664010000000001614f87565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fa361564a565b614fab61564a565b60008361ffff168560010161ffff1681614fc157fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614fee57fe5b0661ffff8110614ffa57fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061506557806001019250614fd9565b898661ffff16826001018161507657fe5b0661ffff811061508257fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906150ed908b908b614ed8565b905080801561510657506151068a8a8760000151614ed8565b15615111575061512e565b8061512157600182039250615128565b8160010193505b50614fd9565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682615166828d6135ef565b9050846001600160801b0316816001600160801b031611156151b4576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b03828116159082161581141594501561528a578c60020b8e60020b1361525a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff166701000000000000006001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152d35782546152ce906152c990600160801b9004600f90810b810b908f900b6132c3565b613f58565b6152f4565b82546152f4906152c990600160801b9004600f90810b810b908f900b6132a7565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533457fe5b0760020b1561534257600080fd5b60008061535d8360020b8560020b8161535757fe5b056144b6565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d1575050600182015460028301546153e4565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540657505060018301546002840154615419565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154d65781516001600160801b03166154ce576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154e5565b81516154e290866135ef565b90505b60006155098360200151860384600001516001600160801b0316600160801b6132d9565b9050600061552f8460400151860385600001516001600160801b0316600160801b6132d9565b905086600f0b6000146155565787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558457506000816001600160801b0316115b156155c2576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612beb57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a", + "07cafdc392214661c8c6c7165e491890ad84bed171": "608060405234801561001057600080fd5b506004361061036d5760003560e01c80638456cb59116101d3578063b7b7289911610104578063e3ee160e116100a2578063ef55bec61161007c578063ef55bec614611122578063f2fde38b1461118e578063f9f92be4146111c1578063fe575a87146111f45761036d565b8063e3ee160e14611075578063e5a6b10f146110e1578063e94a0102146110e95761036d565b8063d505accf116100de578063d505accf14610f64578063d608ea6414610fc2578063d916948714611032578063dd62ed3e1461103a5761036d565b8063b7b7289914610db0578063bd10243014610e78578063cf09299514610e805761036d565b8063a0cc6a6811610171578063aa20e1e41161014b578063aa20e1e414610cd4578063aa271e1a14610d07578063ad38bf2214610d3a578063b2118a8d14610d6d5761036d565b8063a0cc6a6814610c5a578063a457c2d714610c62578063a9059cbb14610c9b5761036d565b80638da5cb5b116101ad5780638da5cb5b14610b6a57806395d89b4114610b725780639fd0506d14610b7a5780639fd5a6cf14610b825761036d565b80638456cb5914610a4b57806388b7ab6314610a535780638a6db9c314610b375761036d565b806338a63183116102ad57806354fd4d501161024b5780635c975abb116102255780635c975abb146109d557806370a08231146109dd5780637ecebe0014610a105780637f2eecc314610a435761036d565b806354fd4d501461094c578063554bab3c146109545780635a049a70146109875761036d565b806340c10f191161028757806340c10f19146107fb57806342966c6814610834578063430239b4146108515780634e44d956146109135761036d565b806338a63183146107b257806339509351146107ba5780633f4ba83a146107f35761036d565b80632fc81e091161031a578063313ce567116102f4578063313ce5671461056f5780633357162b1461058d57806335d99f35146107795780633644e515146107aa5761036d565b80632fc81e09146105015780633092afd51461053457806330adf81f146105675761036d565b80631a8952661161034b5780631a8952661461045657806323b872dd1461048b5780632ab60045146104ce5761036d565b806306fdde0314610372578063095ea7b3146103ef57806318160ddd1461043c575b600080fd5b61037a611227565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103b457818101518382015260200161039c565b50505050905090810190601f1680156103e15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104286004803603604081101561040557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356112d3565b604080519115158252519081900360200190f35b610444611374565b60408051918252519081900360200190f35b6104896004803603602081101561046c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661137a565b005b610428600480360360608110156104a157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611437565b610489600480360360208110156104e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116f2565b6104896004803603602081101561051757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611853565b6104286004803603602081101561054a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118bb565b6104446119b4565b6105776119d8565b6040805160ff9092168252519081900360200190f35b61048960048036036101008110156105a457600080fd5b8101906020810181356401000000008111156105bf57600080fd5b8201836020820111156105d157600080fd5b803590602001918460018302840111640100000000831117156105f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561064657600080fd5b82018360208201111561065857600080fd5b8035906020019184600183028401116401000000008311171561067a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156106cd57600080fd5b8201836020820111156106df57600080fd5b8035906020019184600183028401116401000000008311171561070157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff908116916040810135821691606082013581169160800135166119e1565b610781611d23565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610444611d3f565b610781611d4e565b610428600480360360408110156107d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d6a565b610489611e02565b6104286004803603604081101561081157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611ec5565b6104896004803603602081101561084a57600080fd5b5035612296565b6104896004803603604081101561086757600080fd5b81019060208101813564010000000081111561088257600080fd5b82018360208201111561089457600080fd5b803590602001918460208302840111640100000000831117156108b657600080fd5b9193909290916020810190356401000000008111156108d457600080fd5b8201836020820111156108e657600080fd5b8035906020019184600183028401116401000000008311171561090857600080fd5b509092509050612538565b6104286004803603604081101561092957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356126ef565b61037a612882565b6104896004803603602081101561096a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128b9565b610489600480360360a081101561099d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff6040820135169060608101359060800135612a20565b610428612abe565b610444600480360360208110156109f357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612adf565b61044460048036036020811015610a2657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612af0565b610444612b18565b610489612b3c565b610489600480360360e0811015610a6957600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359160808201359160a08101359181019060e0810160c0820135640100000000811115610ac257600080fd5b820183602082011115610ad457600080fd5b80359060200191846001830284011164010000000083111715610af657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612c16945050505050565b61044460048036036020811015610b4d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612d7a565b610781612da2565b61037a612dbe565b610781612e37565b610489600480360360a0811015610b9857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a081016080820135640100000000811115610be557600080fd5b820183602082011115610bf757600080fd5b80359060200191846001830284011164010000000083111715610c1957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612e53945050505050565b610444612eea565b61042860048036036040811015610c7857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612f0e565b61042860048036036040811015610cb157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612fa6565b61048960048036036020811015610cea57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613109565b61042860048036036020811015610d1d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613270565b61048960048036036020811015610d5057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661329b565b61048960048036036060811015610d8357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135613402565b61048960048036036060811015610dc657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591810190606081016040820135640100000000811115610e0357600080fd5b820183602082011115610e1557600080fd5b80359060200191846001830284011164010000000083111715610e3757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613498945050505050565b61078161352d565b610489600480360360e0811015610e9657600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359160808201359160a08101359181019060e0810160c0820135640100000000811115610eef57600080fd5b820183602082011115610f0157600080fd5b80359060200191846001830284011164010000000083111715610f2357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613549945050505050565b610489600480360360e0811015610f7a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356136a2565b61048960048036036020811015610fd857600080fd5b810190602081018135640100000000811115610ff357600080fd5b82018360208201111561100557600080fd5b8035906020019184600183028401116401000000008311171561102757600080fd5b509092509050613744565b61044461382d565b6104446004803603604081101561105057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613851565b610489600480360361012081101561108c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613889565b61037a6139f1565b610428600480360360408110156110ff57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135613a6a565b610489600480360361012081101561113957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613aa2565b610489600480360360208110156111a457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613bfd565b610489600480360360208110156111d757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613d50565b6104286004803603602081101561120a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613e0d565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff161561136057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61136b338484613e18565b50600192915050565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615824602c913960400191505060405180910390fd5b6113f381613f5f565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e90600090a250565b60015460009074010000000000000000000000000000000000000000900460ff16156114c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336114ce81613f6a565b15611524576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8461152e81613f6a565b15611584576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8461158e81613f6a565b156115e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a6020908152604080832033845290915290205485111561166d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806159146028913960400191505060405180910390fd5b611678878787613f98565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546116b39086614163565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461177857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166117e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061575d602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60125460ff1660011461186557600080fd5b6000611870306141da565b9050801561188357611883308383613f98565b61188c30614224565b5050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b60085460009073ffffffffffffffffffffffffffffffffffffffff16331461192e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806157fb6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff1615611a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061598f602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416611ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806158c1602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611b2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806157346029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611b99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061593c602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a7c6028913960400191505060405180910390fd5b8751611c189060049060208b01906154cd565b508651611c2c9060059060208a01906154cd565b508551611c409060079060208901906154cd565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560018054821686841617905560028054909116918416919091179055611cda8161422f565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d49614276565b905090565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611df757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61136b33848461436b565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615a306022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611fba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158a06021913960400191505060405180910390fd5b33611fc481613f6a565b1561201a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8361202481613f6a565b1561207a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156c96023913960400191505060405180910390fd5b6000841161213f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806157ac6029913960400191505060405180910390fd5b336000908152600d6020526040902054808511156121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615a02602e913960400191505060405180910390fd5b600b546121b590866143b5565b600b556121d4866121cf876121c9836141da565b906143b5565b614430565b6121de8186614163565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561232057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16612388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158a06021913960400191505060405180910390fd5b3361239281613f6a565b156123e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b60006123f3336141da565b90506000831161244e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156a06029913960400191505060405180910390fd5b828110156124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061587a6026913960400191505060405180910390fd5b600b546124b49084614163565b600b556124c5336121cf8386614163565b60408051848152905133917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5919081900360200190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60125460ff1660021461254a57600080fd5b6125566005838361554b565b5060005b83811015612698576003600086868481811061257257fe5b6020908102929092013573ffffffffffffffffffffffffffffffffffffffff168352508101919091526040016000205460ff166125fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806155ed603d913960400191505060405180910390fd5b61262b85858381811061260957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614224565b6003600086868481811061263b57fe5b6020908102929092013573ffffffffffffffffffffffffffffffffffffffff1683525081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560010161255a565b506126a230614224565b505030600090815260036020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081169091556012805490911690911790555050565b60015460009074010000000000000000000000000000000000000000900460ff161561277c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806157fb6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015290565b60005473ffffffffffffffffffffffffffffffffffffffff16331461293f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166129ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061564d6028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff1615612aaa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b612ab78585858585614531565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b6000612aea826141da565b92915050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b60015473ffffffffffffffffffffffffffffffffffffffff163314612bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615a306022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b60015474010000000000000000000000000000000000000000900460ff1615612ca057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b86612caa81613f6a565b15612d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b86612d0a81613f6a565b15612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b612d6f89898989898989614571565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff1615612edd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b612ab78585858585614692565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61136b338484614956565b60015460009074010000000000000000000000000000000000000000900460ff161561303357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3361303d81613f6a565b15613093576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8361309d81613f6a565b156130f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b6130fe338686613f98565b506001949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461318f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166131fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806158c1602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331461332157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661338d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615ad26032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600e5473ffffffffffffffffffffffffffffffffffffffff163314613472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158f06024913960400191505060405180910390fd5b61349373ffffffffffffffffffffffffffffffffffffffff841683836149b2565b505050565b60015474010000000000000000000000000000000000000000900460ff161561352257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b613493838383614a3f565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff16156135d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b866135dd81613f6a565b15613633576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8661363d81613f6a565b15613693576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b612d6f89898989898989614b49565b60015474010000000000000000000000000000000000000000900460ff161561372c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61373b87878787878787614be7565b50505050505050565b60085474010000000000000000000000000000000000000000900460ff168015613771575060125460ff16155b61377a57600080fd5b6137866004838361554b565b506137fb82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f320000000000000000000000000000000000000000000000000000000000000060208201529150614c299050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff161561391357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b8861391d81613f6a565b15613973576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b8861397d81613f6a565b156139d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b6139e48b8b8b8b8b8b8b8b8b614c3f565b5050505050505050505050565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60015474010000000000000000000000000000000000000000900460ff1615613b2c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b88613b3681613f6a565b15613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b88613b9681613f6a565b15613bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b046025913960400191505060405180910390fd5b6139e48b8b8b8b8b8b8b8b8b614c83565b60005473ffffffffffffffffffffffffffffffffffffffff163314613c8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806156ec6026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a1613d4d8161422f565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615824602c913960400191505060405180910390fd5b613dc981614224565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85590600090a250565b6000612aea82613f6a565b73ffffffffffffffffffffffffffffffffffffffff8316613e84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806159de6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157126022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b613d4d816000614cc7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205460ff1c60011490565b73ffffffffffffffffffffffffffffffffffffffff8316614004576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159b96025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216614070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061562a6023913960400191505060405180910390fd5b614079836141da565b8111156140d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806157d56026913960400191505060405180910390fd5b6140e8836121cf836140e2876141da565b90614163565b6140f9826121cf836121c9866141da565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211156141d457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff166000908152600960205260409020547f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b613d4d816001614cc7565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152600093611d4993919290918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b50505050506040518060400160405280600181526020017f3200000000000000000000000000000000000000000000000000000000000000815250614366614d50565b614d54565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a602090815260408083209386168352929052205461349390849084906143b090856143b5565b613e18565b60008282018381101561442957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156144a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615850602a913960400191505060405180910390fd5b6144b282613f6a565b15614508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157876025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff909116600090815260096020526040902055565b612ab78585848487604051602001808481526020018381526020018260ff1660f81b81526001019350505050604051602081830303815290604052614a3f565b73ffffffffffffffffffffffffffffffffffffffff861633146145df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061596a6025913960400191505060405180910390fd5b6145eb87838686614dc8565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208083019190915273ffffffffffffffffffffffffffffffffffffffff808b1683850152891660608301526080820188905260a0820187905260c0820186905260e080830186905283518084039091018152610100909201909252805191012061467d90889083614e88565b6146878783615006565b61373b878787613f98565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214806146c05750428210155b61472b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b60006147d3614738614276565b73ffffffffffffffffffffffffffffffffffffffff80891660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938b166060840152608083018a905260a083019390935260c08083018990528151808403909101815260e09092019052805191012061508b565b9050732d855206d99669dac478aebc8d20c2c00aa1cdc1636ccea6528783856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614860578181015183820152602001614848565b50505050905090810190601f16801561488d5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156148ac57600080fd5b505af41580156148c0573d6000803e3d6000fd5b505050506040513d60208110156148d657600080fd5b505161494357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015290519081900360640190fd5b61494e868686613e18565b505050505050565b61349383836143b084604051806060016040528060258152602001615b4e6025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c168352929052205491906150c5565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613493908490615176565b614a49838361524e565b614ac3837f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960001b8585604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200193505050506040516020818303038152906040528051906020012083614e88565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260106020908152604080832086845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518492917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050565b614b5587838686614dc8565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208083019190915273ffffffffffffffffffffffffffffffffffffffff808b1683850152891660608301526080820188905260a0820187905260c0820186905260e080830186905283518084039091018152610100909201909252805191012061467d90889083614e88565b61373b87878787868689604051602001808481526020018381526020018260ff1660f81b81526001019350505050604051602081830303815290604052614692565b600046614c37848483614d54565b949350505050565b612d6f89898989898988888b604051602001808481526020018381526020018260ff1660f81b81526001019350505050604051602081830303815290604052614b49565b612d6f89898989898988888b604051602001808481526020018381526020018260ff1660f81b81526001019350505050604051602081830303815290604052614571565b80614cda57614cd5826141da565b614d23565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600960205260409020547f8000000000000000000000000000000000000000000000000000000000000000175b73ffffffffffffffffffffffffffffffffffffffff90921660009081526009602052604090209190915550565b4690565b8251602093840120825192840192909220604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8187015280820194909452606084019190915260808301919091523060a0808401919091528151808403909101815260c09092019052805191012090565b814211614e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615675602b913960400191505060405180910390fd5b804210614e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b296025913960400191505060405180910390fd5b614e82848461524e565b50505050565b732d855206d99669dac478aebc8d20c2c00aa1cdc1636ccea65284614eb4614eae614276565b8661508b565b846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614f23578181015183820152602001614f0b565b50505050905090810190601f168015614f505780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614f6f57600080fd5b505af4158015614f83573d6000803e3d6000fd5b505050506040513d6020811015614f9957600080fd5b505161349357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000818484111561516e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561513357818101518382015260200161511b565b50505050905090810190601f1680156151605780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60606151d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166152dc9092919063ffffffff16565b805190915015613493578080602001905160208110156151f757600080fd5b5051613493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615a52602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915290205460ff16156152d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615aa4602e913960400191505060405180910390fd5b5050565b6060614c378484600085856152f085615447565b61535b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106153c557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615388565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615427576040519150601f19603f3d011682016040523d82523d6000602084013e61542c565b606091505b509150915061543c82828661544d565b979650505050505050565b3b151590565b6060831561545c575081614429565b82511561546c5782518084602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815284516024840152845185939192839260440191908501908083836000831561513357818101518382015260200161511b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061550e57805160ff191683800117855561553b565b8280016001018555821561553b579182015b8281111561553b578251825591602001919060010190615520565b506155479291506155d7565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155aa578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561553b565b8280016001018555821561553b579182015b8281111561553b5782358255916020019190600101906155bc565b5b8082111561554757600081556001016155d856fe46696174546f6b656e56325f323a20426c61636b6c697374696e672070726576696f75736c7920756e626c61636b6c6973746564206163636f756e742145524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e56325f323a204163636f756e7420697320626c61636b6c697374656446696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e56325f323a2042616c616e636520657863656564732028325e323535202d20312946696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e56323a2063616c6c6572206d7573742062652074686520706179656546696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f7420746865207061757365725361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122007527ee892a2b7b8df8b67c0c9e309a1b1e114ae0df73d736ea4bdaed9b3c13c64736f6c634300060c0033", + "07e15fc38f6d8c56af07bbcbe3baf5708a2bf42392": "60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146101315780638f2839701461016f578063f851a440146101af5761005a565b80633659cfe6146100645780634f1ef286146100a4575b6100626101c4565b005b34801561007057600080fd5b506100626004803603602081101561008757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101de565b610062600480360360408110156100ba57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100f257600080fd5b82018360208201111561010457600080fd5b8035906020019184600183028401116401000000008311171561012657600080fd5b509092509050610232565b34801561013d57600080fd5b50610146610309565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561017b57600080fd5b506100626004803603602081101561019257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610318565b3480156101bb57600080fd5b50610146610420565b6101cc610430565b6101dc6101d76104c4565b6104e9565b565b6101e661050d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275761022281610532565b61022f565b61022f6101c4565b50565b61023a61050d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fc5761027683610532565b60003073ffffffffffffffffffffffffffffffffffffffff16348484604051808383808284376040519201945060009350909150508083038185875af1925050503d80600081146102e3576040519150601f19603f3d011682016040523d82523d6000602084013e6102e8565b606091505b50509050806102f657600080fd5b50610304565b6103046101c4565b505050565b60006103136104c4565b905090565b61032061050d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275773ffffffffffffffffffffffffffffffffffffffff81166103bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806106606036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e861050d565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a161022281610587565b600061031361050d565b3b151590565b61043861050d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061062e6032913960400191505060405180910390fd5b6101dc6101dc565b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35490565b3660008037600080366000845af43d6000803e808015610508573d6000f35b3d6000fd5b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b5490565b61053b816105ab565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6105b48161042a565b610609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610696603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a2646970667358221220add33217651e870315587735c97aafbde2750237c65bae5c949e81678cce09b864736f6c634300060c0033", + "07e30fedd158a2e3b13e9badaeabafc5516e95e8c7": "6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a7231582004517e3a6027a339f2af17215b78b0c9c8ff90e1867d6532c80174c14f66f9bd64736f6c63430005100032", + "07f62bd525e82577a162de88bd70de032a62675237": "608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f4314610800578063f305839914610820578063f30dba9314610828578063f637731d146108aa576101ae565b8063c45a0155146107d1578063d0c93a7c146107d9578063d21220a7146107f8576101ae565b8063883bdbfd116100c8578063883bdbfd14610633578063a34123a71461073c578063a38807f214610776576101ae565b806370cf754a146105c65780638206a4d1146105ce57806385b66729146105f6576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146104705780634f1eb3d8146104fc578063514ea4bf1461054d5780635339c296146105a6576101ae565b80633850c7bd1461035b5780633c8a7d8d146103b45780634614131914610456576101ae565b80631ad8b03b1161018c5780631ad8b03b146102aa578063252c09d7146102e157806332148f6714610338576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610286575b600080fd5b6101bb6108d0565b604080516001600160a01b039092168252519081900360200190f35b61026d600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a08101608082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b5090925090506108f4565b6040805192835260208301919091528051918290030190f35b61028e6114ad565b604080516001600160801b039092168252519081900360200190f35b6102b26114bc565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fe600480360360208110156102f757600080fd5b50356114d6565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103596004803603602081101561034e57600080fd5b503561ffff1661151c565b005b610363611616565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b61026d600480360360a08110156103ca57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a08101608082013564010000000081111561041757600080fd5b82018360208201111561042957600080fd5b8035906020019184600183028401116401000000008311171561044b57600080fd5b509092509050611666565b61045e611922565b60408051918252519081900360200190f35b6103596004803603608081101561048657600080fd5b6001600160a01b0382351691602081013591604082013591908101906080810160608201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111640100000000831117156104f157600080fd5b509092509050611928565b6102b2600480360360a081101561051257600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611d83565b61056a6004803603602081101561056357600080fd5b5035611f9d565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045e600480360360208110156105bc57600080fd5b503560010b611fda565b61028e611fec565b610359600480360360408110156105e457600080fd5b5060ff81358116916020013516612010565b6102b26004803603606081101561060c57600080fd5b506001600160a01b03813516906001600160801b036020820135811691604001351661220f565b6106a36004803603602081101561064957600080fd5b81019060208101813564010000000081111561066457600080fd5b82018360208201111561067657600080fd5b8035906020019184602083028401116401000000008311171561069857600080fd5b5090925090506124dc565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e75781810151838201526020016106cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561072657818101518382015260200161070e565b5050505090500194505050505060405180910390f35b61026d6004803603606081101561075257600080fd5b508035600290810b91602081013590910b90604001356001600160801b0316612569565b6107a06004803603604081101561078c57600080fd5b508035600290810b9160200135900b6126e0565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b6101bb6128d7565b6107e16128fb565b6040805160029290920b8252519081900360200190f35b6101bb61291f565b610808612943565b6040805162ffffff9092168252519081900360200190f35b61045e612967565b6108486004803603602081101561083e57600080fd5b503560020b61296d565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610359600480360360208110156108c057600080fd5b50356001600160a01b03166129db565b7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc581565b6000806108ff612bf0565b85610936576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526109ef576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a3a5780600001516001600160a01b0316866001600160a01b0316118015610a35575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a6c565b80600001516001600160a01b0316866001600160a01b0316108015610a6c57506401000276a36001600160a01b038716115b610aa3576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610ad25760048460a0015160ff16901c610ae5565b60108460a0015160ff1681610ae357fe5b065b60ff1681526004546001600160801b03166020820152604001610b06612c27565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8257600254610b86565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd55750886001600160a01b031681604001516001600160a01b031614155b15610f9f57610be261560e565b60408201516001600160a01b031681526060820151610c25906006907f00000000000000000000000000000000000000000000000000000000000000018f612c2b565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5657620d89e7196020820152610c75565b6020810151620d89e860029190910b1315610c7557620d89e860208201525b610c828160200151612d6d565b6001600160a01b031660608201526040820151610d13908d610cbc578b6001600160a01b031683606001516001600160a01b031611610cd6565b8b6001600160a01b031683606001516001600160a01b0316105b610ce4578260600151610ce6565b8b5b60c085015185517f000000000000000000000000000000000000000000000000000000000000006461309f565b60c085015260a084015260808301526001600160a01b031660408301528215610d7557610d498160c00151826080015101613291565b825103825260a0810151610d6b90610d6090613291565b6020840151906132a7565b6020830152610db0565b610d828160a00151613291565b825101825260c08101516080820151610daa91610d9f9101613291565b6020840151906132c3565b60208301525b835160ff1615610df6576000846000015160ff168260c0015181610dd057fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3557610e298160c00151600160801b8460c001516001600160801b03166132d9565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f5e57806040015115610f35578360a00151610ebf57610e9d846040015160008760200151886040015188602001518a606001516008613389909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f0b82602001518e610ed657600154610edc565b84608001515b8f610eeb578560800151610eef565b6002545b608089015160608a015160408b0151600595949392919061351c565b90508c15610f17576000035b610f258360c00151826135ef565b6001600160801b031660c0840152505b8b610f44578060200151610f4d565b60018160200151035b600290810b900b6060830152610f99565b80600001516001600160a01b031682604001516001600160a01b031614610f9957610f8c82604001516136a5565b600290810b900b60608301525b50610baf565b836020015160020b816060015160020b1461107a57600080610fed86604001518660400151886020015188602001518a606001518b6080015160086139d1909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110ac9050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110f25760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561114257608081015160015560a08101516001600160801b03161561113d5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b611188565b608081015160025560a08101516001600160801b0316156111885760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146111a157602081015181518b036111ae565b80600001518a0381602001515b90965094508a156112e75760008512156111f0576111f07f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423928d87600003613b86565b60006111fa613cd4565b9050336001600160a01b0316636118b15d88888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561127e57600080fd5b505af1158015611292573d6000803e3d6000fd5b5050505061129e613cd4565b6112a88289613e0d565b11156112e1576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b50611411565b600086121561131e5761131e7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc58d88600003613b86565b6000611328613e1d565b9050336001600160a01b0316636118b15d88888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506113cc613e1d565b6113d68288613e0d565b111561140f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff81106114e757600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff16611560576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611575612bf0565b60008054600160d81b900461ffff169061159160088385613eb5565b6000805461ffff808416600160d81b810261ffff60d81b19909316929092179092559192508316146115fe576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff166116ad576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b0385166116cd57600080fd5b60008061171b60405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b81526020016117118a6001600160801b0316613f58565b600f0b9052613f69565b9250925050819350809250600080600086111561173d5761173a613cd4565b91505b841561174e5761174b613e1d565b90505b336001600160a01b031663b27ef48e87878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050600086111561183b576117f9613cd4565b6118038388613e0d565b111561183b576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b841561188b57611849613e1d565b6118538287613e0d565b111561188b576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff1661196c576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611981612bf0565b6004546001600160801b0316806119c3576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b60006119f8867f000000000000000000000000000000000000000000000000000000000000006462ffffff16620f42406141a9565b90506000611a2f867f000000000000000000000000000000000000000000000000000000000000006462ffffff16620f42406141a9565b90506000611a3b613cd4565b90506000611a47613e1d565b90508815611a7a57611a7a7f0000000000000000000000009151434b16b9763660705744891fa906f660ecc58b8b613b86565b8715611aab57611aab7f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423928b8a613b86565b336001600160a01b0316637eee804185858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b2d57600080fd5b505af1158015611b41573d6000803e3d6000fd5b505050506000611b4f613cd4565b90506000611b5b613e1d565b905081611b688588613e0d565b1115611ba0576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611bab8487613e0d565b1115611be3576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611c725760008054600160e81b9004600f16908115611c16578160ff168481611c1057fe5b04611c19565b60005b90506001600160801b03811615611c4c57600380546001600160801b038082168401166001600160801b03199091161790555b611c66818503600160801b8d6001600160801b03166132d9565b60018054909101905550505b8015611cfd5760008054600160e81b900460041c600f16908115611ca2578160ff168381611c9c57fe5b04611ca5565b60005b90506001600160801b03811615611cd757600380546001600160801b03600160801b8083048216850182160291161790555b611cf1818403600160801b8d6001600160801b03166132d9565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611dca576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611de460073389896141e3565b60038101549091506001600160801b0390811690861611611e055784611e14565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e3c5783611e52565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611eb7576003810180546001600160801b031981166001600160801b03918216869003821617909155611eb7907f0000000000000000000000009151434b16b9763660705744891fa906f660ecc5908a908616613b86565b6001600160801b03821615611f1d576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f1d907f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf42392908a908516613b86565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f000000000000000000000000000000000000097451ff859c3282305ffa26a9c581565b600054600160f01b900460ff16612054576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df41691638da5cb5b916004808301926020929190829003018186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d60208110156120eb57600080fd5b50516001600160a01b0316331461210157600080fd5b60ff82161580612124575060048260ff16101580156121245750600a8260ff1611155b801561214e575060ff8116158061214e575060048160ff161015801561214e5750600a8160ff1611155b61215757600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff16612256576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df41691638da5cb5b916004808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b50516001600160a01b0316331461230357600080fd5b6003546001600160801b039081169085161161231f578361232c565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116123525782612366565b600354600160801b90046001600160801b03165b90506001600160801b038216156123e7576003546001600160801b038381169116141561239557600019909101905b600380546001600160801b031981166001600160801b039182168590038216179091556123e7907f0000000000000000000000009151434b16b9763660705744891fa906f660ecc59087908516613b86565b6001600160801b0381161561246d576003546001600160801b03828116600160801b90920416141561241857600019015b600380546001600160801b03600160801b80830482168590038216029181169190911790915561246d907f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf423929087908416613b86565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806124e7612bf0565b61255e6124f2612c27565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614247565b915091509250929050565b600080548190600160f01b900460ff166125b0576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061260990606081016125fc6001600160801b038a16613f58565b600003600f0b9052613f69565b925092509250816000039450806000039350600085118061262a5750600084115b15612669576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006126ed612bf0565b6126f785856143a1565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b9367010000000000000082046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061275f57600080fd5b6003820154600681900b985067010000000000000081046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806127a457600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b1215905061284d575093909403965090039350900390506128d0565b8a60020b816020015160020b12156128c1576000612869612c27565b602083015160408401516004546060860151939450600093849361289f936008938893879392916001600160801b031690613389565b9a9003989098039b5050949096039290920396509091030392506128d0915050565b50949093039650039350900390505b9250925092565b7f000000000000000000000000179d9a5592bc77050796f7be28058c51ca575df481565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf4239281565b7f000000000000000000000000000000000000000000000000000000000000006481565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b9067010000000000000081046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a1e576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a29826136a5565b9050600080612a41612a39612c27565b60089061446a565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b73ffffffffffffffffffffffffffffffffffffffff19909116871762ffffff60a01b1916600160a01b62ffffff9787900b9790971696909602959095177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9091021761ffff60d81b1916600160d81b909602959095177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612b9957fe5b05029050600083600281900b620d89e881612bb057fe5b0502905060008460020b83830360020b81612bc757fe5b0560010190508062ffffff166001600160801b03801681612be457fe5b0493505050505b919050565b306001600160a01b037f000000000000000000000000f62bd525e82577a162de88bd70de032a626752371614612c2557600080fd5b565b4290565b60008060008460020b8660020b81612c3f57fe5b05905060008660020b128015612c6657508460020b8660020b81612c5f57fe5b0760020b15155b15612c7057600019015b8315612ce557600080612c82836144b6565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612cc757888360ff16860302612cda565b88612cd1826144c8565b840360ff168603025b965050505050612d63565b600080612cf4836001016144b6565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d4657888360ff0360ff16866001010102612d5c565b8883612d5183614568565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612d84578260020b612d8c565b8260020b6000035b9050620d89e8811115612dca576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612dde57600160801b612df0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e24576ffff97272373d413259a46990580e213a0260801c5b6004821615612e43576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e62576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e81576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ea0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ebf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ede576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612efe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612f9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fbe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fde576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612fff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561301f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561303e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561305b576b048a170391f7dc42444e8fa20260801c5b60008460020b131561307657806000198161307257fe5b0490505b64010000000081061561308a57600161308d565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131245760006130d88989620f42400362ffffff16620f42406132d9565b9050826130f1576130ec8c8c8c6001614652565b6130fe565b6130fe8b8d8c60016146cd565b955085811061310f578a965061311e565b61311b8c8b838661478a565b96505b5061316e565b8161313b576131368b8b8b60006146cd565b613148565b6131488a8c8b6000614652565b935083886000031061315c5789955061316e565b61316b8b8a8a600003856147d6565b95505b6001600160a01b038a81169087161482156131d15780801561318d5750815b6131a35761319e878d8c60016146cd565b6131a5565b855b95508080156131b2575081155b6131c8576131c3878d8c6000614652565b6131ca565b845b945061321b565b8080156131db5750815b6131f1576131ec8c888c6001614652565b6131f3565b855b9550808015613200575081155b613216576132118c888c60006146cd565b613218565b845b94505b8115801561322b57508860000385115b15613237578860000394505b81801561325657508a6001600160a01b0316876001600160a01b031614155b15613265578589039350613282565b61327f868962ffffff168a620f42400362ffffff166141a9565b93505b50505095509550955095915050565b6000600160ff1b82106132a357600080fd5b5090565b808203828113156000831215146132bd57600080fd5b92915050565b818101828112156000831215146132bd57600080fd5b600080806000198587098686029250828110908390030390508061330f576000841161330457600080fd5b508290049050613382565b80841161331b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613430576000898661ffff1661ffff81106133aa57fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461341c57613419818a8988614822565b90505b806020015181604001519250925050613510565b8688036000806134458c8c858c8c8c8c6148d2565b91509150816000015163ffffffff168363ffffffff161415613477578160200151826040015194509450505050613510565b805163ffffffff8481169116141561349f578060200151816040015194509450505050613510565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816134cd57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816134ff57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b036701000000000000008085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561365457826001600160801b03168260000384039150816001600160801b03161061364f576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6132bd565b826001600160801b03168284019150816001600160801b031610156132bd576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906136e1575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613716576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106137b757607f810383901c91506137c1565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146139c257886001600160a01b03166139a682612d6d565b6001600160a01b031611156139bb57816139bd565b805b6139c4565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106139e757fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a575788859250925050613510565b8461ffff168461ffff16118015613a7857506001850361ffff168961ffff16145b15613a8557839150613a89565b8491505b8161ffff168960010161ffff1681613a9d57fe5b069250613aac81898989614822565b8a8461ffff1661ffff8110613abd57fe5b825191018054602084015160408501516060909501511515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16640100000000026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c025780518252601f199092019160209182019101613be3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c64576040519150601f19603f3d011682016040523d82523d6000602084013e613c69565b606091505b5091509150818015613c97575080511580613c975750808060200190516020811015613c9457600080fd5b50515b613ccd576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f0000000000000000000000009151434b16b9763660705744891fa906f660ecc51693919290918291908083835b60208310613d6d5780518252601f199092019160209182019101613d4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dcd576040519150601f19603f3d011682016040523d82523d6000602084013e613dd2565b606091505b5091509150818015613de657506020815110155b613def57600080fd5b808060200190516020811015613e0457600080fd5b50519250505090565b808201828110156132bd57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000e15fc38f6d8c56af07bbcbe3baf5708a2bf4239216939192909182919080838360208310613d6d5780518252601f199092019160209182019101613d4e565b6000808361ffff1611613ef3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f09575081613382565b825b8261ffff168161ffff161015613f4f576001858261ffff1661ffff8110613f2e57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f0b565b50909392505050565b80600f81900b8114612beb57600080fd5b6000806000613f76612bf0565b613f88846020015185604001516143a1565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c08501528851908901519489015192890151939461402c9491939092909190614acf565b93508460600151600f0b6000146141a157846020015160020b816020015160020b12156140815761407a6140638660200151612d6d565b6140708760400151612d6d565b8760600151614c84565b92506141a1565b846040015160020b816020015160020b12156141775760045460408201516001600160801b03909116906140d3906140b7612c27565b60208501516060860151608087015160089493929187916139d1565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151614123919061411990612d6d565b8860600151614c84565b93506141416141358760200151612d6d565b83516060890151614cc8565b92506141518187606001516135ef565b600480546001600160801b0319166001600160801b0392909216919091179055506141a1565b61419e6141878660200151612d6d565b6141948760400151612d6d565b8760600151614cc8565b91505b509193909250565b60006141b68484846132d9565b9050600082806141c257fe5b84860911156133825760001981106141d957600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff1611614287576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff8111801561429f57600080fd5b506040519080825280602002602001820160405280156142c9578160200160208202803683370190505b509150865167ffffffffffffffff811180156142e457600080fd5b5060405190808252806020026020018201604052801561430e578160200160208202803683370190505b50905060005b87518110156143945761433f8a8a8a848151811061432e57fe5b60200260200101518a8a8a8a613389565b84838151811061434b57fe5b6020026020010184848151811061435e57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614314565b5097509795505050505050565b8060020b8260020b126143e1576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614424576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614466576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b60008082116144d657600080fd5b600160801b82106144e957608091821c91015b68010000000000000000821061450157604091821c91015b640100000000821061451557602091821c91015b62010000821061452757601091821c91015b610100821061453857600891821c91015b6010821061454857600491821c91015b6004821061455857600291821c91015b60028210612beb57600101919050565b600080821161457657600080fd5b5060ff6001600160801b0382161561459157607f1901614599565b608082901c91505b67ffffffffffffffff8216156145b257603f19016145ba565b604082901c91505b63ffffffff8216156145cf57601f19016145d7565b602082901c91505b61ffff8216156145ea57600f19016145f2565b601082901c91505b60ff821615614604576007190161460c565b600882901c91505b600f82161561461e5760031901614626565b600482901c91505b60038216156146385760011901614640565b600282901c91505b6001821615612beb5760001901919050565b6000836001600160a01b0316856001600160a01b03161115614672579293925b8161469f5761469a836001600160801b03168686036001600160a01b0316600160601b6132d9565b6146c2565b6146c2836001600160801b03168686036001600160a01b0316600160601b6141a9565b90505b949350505050565b6000836001600160a01b0316856001600160a01b031611156146ed579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661472957600080fd5b8361475957866001600160a01b031661474c8383896001600160a01b03166132d9565b8161475357fe5b0461477f565b61477f6147708383896001600160a01b03166141a9565b886001600160a01b0316614cf7565b979650505050505050565b600080856001600160a01b0316116147a157600080fd5b6000846001600160801b0316116147b757600080fd5b816147c95761469a8585856001614d02565b6146c28585856001614de3565b600080856001600160a01b0316116147ed57600080fd5b6000846001600160801b03161161480357600080fd5b816148155761469a8585856000614de3565b6146c28585856000614d02565b61482a61564a565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b03161161487e576001614880565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148ab57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b6148da61564a565b6148e261564a565b888561ffff1661ffff81106148f357fe5b60408051608081018252919092015463ffffffff81168083526401000000008204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061495890899089614ed8565b15614990578663ffffffff16826000015163ffffffff16141561497a57613510565b8161498783898988614822565b91509150613510565b888361ffff168660010161ffff16816149a557fe5b0661ffff1661ffff81106149b557fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a6c57604080516080810182528a5463ffffffff811682526401000000008104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614a7b88836000015189614ed8565b614ab2576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614abf8989898887614f9b565b9150915097509795505050505050565b6000614ade60078787876141e3565b60015460025491925090600080600f87900b15614c24576000614aff612c27565b6000805460045492935090918291614b499160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613389565b9092509050614b8360058d8b8d8b8b87898b60007f000000000000000000000000000000000000097451ff859c3282305ffa26a9c561513b565b9450614bba60058c8b8d8b8b87898b60017f000000000000000000000000000000000000097451ff859c3282305ffa26a9c561513b565b93508415614bee57614bee60068d7f0000000000000000000000000000000000000000000000000000000000000001615325565b8315614c2057614c2060068c7f0000000000000000000000000000000000000000000000000000000000000001615325565b5050505b600080614c3660058c8c8b8a8a61538b565b9092509050614c47878a8484615437565b600089600f0b1215614c75578315614c6457614c6460058c6155cc565b8215614c7557614c7560058b6155cc565b50505050505095945050505050565b60008082600f0b12614caa57614ca5614ca085858560016146cd565b613291565b6146c5565b614cbd614ca085858560000360006146cd565b600003949350505050565b60008082600f0b12614ce457614ca5614ca08585856001614652565b614cbd614ca08585856000036000614652565b808204910615150190565b60008115614d755760006001600160a01b03841115614d3857614d3384600160601b876001600160801b03166132d9565b614d50565b6001600160801b038516606085901b81614d4e57fe5b045b9050614d6d614d686001600160a01b03881683613e0d565b6155f8565b9150506146c5565b60006001600160a01b03841115614da357614d9e84600160601b876001600160801b03166141a9565b614dba565b614dba606085901b6001600160801b038716614cf7565b905080866001600160a01b031611614dd157600080fd5b6001600160a01b0386160390506146c5565b600082614df15750836146c5565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614e91576001600160a01b03861684810290858281614e3157fe5b041415614e6257818101828110614e6057614e5683896001600160a01b0316836141a9565b93505050506146c5565b505b614e8882614e83878a6001600160a01b03168681614e7c57fe5b0490613e0d565b614cf7565b925050506146c5565b6001600160a01b03861684810290858281614ea857fe5b04148015614eb557508082115b614ebe57600080fd5b808203614e56614d68846001600160a01b038b16846141a9565b60008363ffffffff168363ffffffff1611158015614f0257508363ffffffff168263ffffffff1611155b15614f1e578163ffffffff168363ffffffff1611159050613382565b60008463ffffffff168463ffffffff1611614f46578363ffffffff1664010000000001614f4e565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614f7f578363ffffffff1664010000000001614f87565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fa361564a565b614fab61564a565b60008361ffff168560010161ffff1681614fc157fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614fee57fe5b0661ffff8110614ffa57fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061506557806001019250614fd9565b898661ffff16826001018161507657fe5b0661ffff811061508257fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906150ed908b908b614ed8565b905080801561510657506151068a8a8760000151614ed8565b15615111575061512e565b8061512157600182039250615128565b8160010193505b50614fd9565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682615166828d6135ef565b9050846001600160801b0316816001600160801b031611156151b4576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b03828116159082161581141594501561528a578c60020b8e60020b1361525a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff166701000000000000006001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152d35782546152ce906152c990600160801b9004600f90810b810b908f900b6132c3565b613f58565b6152f4565b82546152f4906152c990600160801b9004600f90810b810b908f900b6132a7565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533457fe5b0760020b1561534257600080fd5b60008061535d8360020b8560020b8161535757fe5b056144b6565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d1575050600182015460028301546153e4565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540657505060018301546002840154615419565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154d65781516001600160801b03166154ce576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154e5565b81516154e290866135ef565b90505b60006155098360200151860384600001516001600160801b0316600160801b6132d9565b9050600061552f8460400151860385600001516001600160801b0316600160801b6132d9565b905086600f0b6000146155565787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558457506000816001600160801b0316115b156155c2576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612beb57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a", + "08038aac60e1d17ce2229812eca8ee7800214baffc": "6499f69da65f76fcff300a9f5d2713f3a31f11128d0ee51aa1fd6df428d08379", + "080d742a9b4d766e256f0c7dd5bbe832337827beb7": "2a2455f4b40e3dc00d04c4a77c376952ba67216c4353a1cce747842dd338512f", + "082deb30545651ea6402bb5852883a5f37898eeaea": "be8f3a83cbaf3782249cf796c81d296126b3c90d55e21624773cbb282db8ab7d", + "0875e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81": "3cf4a6603e582358a24acc8b252046531eab4b4faaa3d117cb2c362c28356c5f", + "089151434b16b9763660705744891fa906f660ecc5": "4d9be648c5bf39973670d9f8b481d5d0b971e6a2db2deccc6b98cde21c5dd83e", + "08af37e8b6c9ed7f6318979f56fc287d76c30847ff": "61466328a9d17e782f4a37d32db189f981ce32e45de6a4668c3f7bb1cd8d49ae", + "08b243320bcf9c95db7f74108b6773b8f4dc3adaf5": "92ec378e486679a2afc510f513c2f12363d259030297bf35be210d95985f0ce4", + "08cafdc392214661c8c6c7165e491890ad84bed171": "9efaef237ba96760e6b2de3cb24bda8b987e9b54352c3fd2100396363526f2e0", + "08e15fc38f6d8c56af07bbcbe3baf5708a2bf42392": "e43587ffe1bcce27e2c8d97957762667ac603083224e5028ccf00990de9b8071", + "08e30fedd158a2e3b13e9badaeabafc5516e95e8c7": "e298e93cf459936c8a4efc44948bf90bd4787b626a377e22aab251da9bae60ae", + "08f62bd525e82577a162de88bd70de032a62675237": "cafc0854cfcb8df049f3db02ada1e7abe135faf7e24f968a36aa7a861aa78e76", + "092deb30545651ea6402bb5852883a5f37898eeaea": "0000000000003ec9", + "0975e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81": "0000000000002ae6", + "0a3ffeaf16afb4407ca99f87ed321ba0c41257db10": "0000000000041146", + "0a63b9f25148ccc5337f0a889e8b3f0f8c9130c2fa": "0000000000000155", + "150173656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0000": "", + "150173656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0001": "", + "150173656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0002": "", + "150273656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0006": "75e9ea2c01b0ce74c22f0e5d02cec57d8e5abe81", + "150573656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0000": "", + "150573656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0001": "", + "150573656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0002": "", + "1c": "2231303030303030303030302e30303030303030303030303030303030303022" + }, + "has": [ + "150273656931777a687271707266707861676b72787a396673706d6e72746330667175736b356736796e70657a636c3730357366717335356e717363656a306b0006" + ] + }, + "evm_transient": { + "reads": {}, + "has": [] + }, + "ibc": { + "reads": { + "636c69656e74732f30392d6c6f63616c686f73742f636c69656e745374617465": "" + }, + "has": [] + }, + "mem_capability": { + "reads": { + "6d656d5f696e697469616c697a6564": "01" + }, + "has": [] + }, + "params": { + "reads": { + "646973747269627574696f6e2f6261736570726f706f736572726577617264": "22302e30303030303030303030303030303030303022", + "646973747269627574696f6e2f626f6e757370726f706f736572726577617264": "22302e30303030303030303030303030303030303022", + "646973747269627574696f6e2f636f6d6d756e697479746178": "22302e30303030303030303030303030303030303022", + "65766d2f4b657942617365466565506572476173": "22302e30303030303030303030303030303030303022", + "65766d2f4b657944656c697665725478486f6f6b5761736d4761734c696d6974": "2233303030303022", + "65766d2f4b65794d617844796e616d696342617365466565446f776e7761726441646a7573746d656e74": "22302e30303339303030303030303030303030303022", + "65766d2f4b65794d617844796e616d69634261736546656555707761726441646a7573746d656e74": "22302e30303735303030303030303030303030303022", + "65766d2f4b65794d6178696d756d466565506572476173": "22313030303030303030303030302e30303030303030303030303030303030303022", + "65766d2f4b65794d696e466565506572476173": "2231303030303030303030302e30303030303030303030303030303030303022", + "65766d2f4b65795072696f726974794e6f726d616c697a6572": "22312e30303030303030303030303030303030303022", + "65766d2f4b65795265676973746572506f696e74657244697361626c6564": "74727565", + "65766d2f4b657954617267657447617355736564506572426c6f636b": "223230303030303022", + "65766d2f4b657957686974656c69737465644377436f6465486173686573466f7244656c656761746543616c6c": "6e756c6c", + "736c617368696e672f4d696e5369676e656450657257696e646f77": "22302e30353030303030303030303030303030303022", + "736c617368696e672f5369676e6564426c6f636b7357696e646f77": "2231303830303022", + "7374616b696e672f486973746f726963616c456e7472696573": "3130303030", + "7374616b696e672f4d617856616c696461746f7273": "3430" + }, + "has": [] + }, + "slashing": { + "reads": { + "011400d66a1cb50a2473d8f011d369adb117a527072d": "0a3173656976616c636f6e7331717274783538393470676a38386b38737a38666b6e7464337a376a6a777065646a686d76676710eeb5e85018dfdd032200308702", + "01140ab238961abdbc7c99c6693765db290420e2ed87": "0a3173656976616c636f6e73317032657233397336686b37386578777864796d6b746b656671737377396d76387a303034647810daa3855518b3b303220030f002", + "0114114c0350b9ce023f98518d9f22a2e2e7548daf66": "0a3173656976616c636f6e73317a39787178353965656370726c787a33336b306a3967687a756132676d746d7834616b6e7a3418eecf0522003022", + "01141394b86452a60711a0d3637e327d7d080a459b76": "0a3173656976616c636f6e73317a77327473657a6a356372337267786e76646c72796c74617071397974786d6b66653272377610d2a5ce51189b5e2200301b", + "0114183388665bac7d2537a91633fdc9ed5d6f46ef37": "0a3173656976616c636f6e73317271656373656a6d3433376a326461667a63656c6d6a306474346835646d65686b353670333618eecf05220030ae04", + "01141aefcc514e41f3dd21f5ce20b7ba3d142eb56256": "0a3173656976616c636f6e73317274687563353277673865613667303465637374307733617a73687432636a6b75686678356818f5c504220030c507", + "011425abc30b5e07afd6ca59eaa3495ac44d6b5c3026": "0a3173656976616c636f6e7331796b3475787a363771376861646a6a65613233356a6b6b7966343434637670786a6136667a7618b6f905220c08e3cff7a30610bad1c28c0130840e", + "0114314e76481bdea52cea72a30bc185b14f97e7e1d5": "0a3173656976616c636f6e733178393838766a716d6d366a6a65366e6a3576397572706433663774373063773432703775327010de91af5318cf012200309805", + "0114399548ff09159af3711df1ef08cc243c505130b6": "0a3173656976616c636f6e733138783235336c63667a6b64307875676137386873336e7079383367397a76396b39753773797a18eecf052200308007", + "01143d4ceb152ca0271e5a9af577d67c828a228c87df": "0a3173656976616c636f6e7331383478776b39667635716e33756b353637346d61766c797a336733676570376c75356363397310a183ad0a18acc6052200308302", + "011440f909929f7fa9d475e2c6f5a94ac9d6d97cf83d": "0a3173656976616c636f6e7331677275736e79356c303735616761307a636d36366a6a6b66366d76686537706174343036773018eecf05220030cd09", + "011459e78e0b1133144460575337faa2558399e43661": "0a3173656976616c636f6e733174386e63757a63337876327967637a6832766d6c34676a347377763767646e7039356c366c7818eecf05220030dd06", + "01146ca80ee04179ff609b07f9bbc65c6e47f20d09ca": "0a3173656976616c636f6e7331646a357161637a7030386c6b707863386c78617576687277676c6571367a773275676363786a108a881518a4a10522003008", + "01146e900c94f99b249cd8fb6538969e0d9e099c2f52": "0a3173656976616c636f6e733164366771653938656e766a66656b386d76357566643873646e6379656374366a666e6465657010e589ad0d18b1c402220030f701", + "01147482d68a8c68fd7204273223d90864207b1558b5": "0a3173656976616c636f6e7331776a7064647a35766472376879707038786733616a7a727979706133326b393430397134637318eecf052200307e", + "0114922357bd8e69e6119d0630f7abbbf7c5e3879f2f": "0a3173656976616c636f6e73316a6733343030767764386e707238677878726d3668776c6863683363303865307a79796d6d6818eecf05220030850f", + "01149f1f7b9b3584198f985adb6aa72037731d2a3c73": "0a3173656976616c636f6e73316e75306868786534737376636c787a366d643432776770687776776a3530726e74796464756818eecf05220030f702", + "0114a633a4eeb521dd9f09326bf5c945bc24327c6a66": "0a3173656976616c636f6e733135636536666d343479387765377a666a643036756a3364757973653863366e78666d3330753318eecf05220030e303", + "0114aa5241dbd04ed2d969216d30c14d408ce3356919": "0a3173656976616c636f6e733134666679726b3773666d66646a366670643563767a6e3271336e336e3236676568727134793410d7d9e20818d6c303220030ab0c", + "0114ab873ff0a3f0bd6d36712004c61ce8bf5970eb60": "0a3173656976616c636f6e73313477726e6c753972377a376b36646e3379717a76763838676861766870366d7176357166337010ede1931d18e86b220c08f4bc8eaf0610c683de8a0230b807", + "0114b016593fc42b4a1988404f3d80afef984bd966e2": "0a3173656976616c636f6e73316b7174396a303779396439706e7a7a716675376370746c306e7039616a65687a6e6b6879743910a5ffb71e18d79406220b0880d3dbb60610cd81973130d903", + "0114b1e0490aac5cd08248c284378296d86810410591": "0a3173656976616c636f6e73316b3873796a7a3476746e6767796a787a73736d6339396b63647167797a70763376633539707018eecf05220030bf03", + "0114ba479c5c63d95550191e3d6434ba557bd5f69508": "0a3173656976616c636f6e733168667265636872726d3932347178673738346a7266776a343030326c6439676767616d61686410dfc18c0e18e1cb032200309701", + "0114cc60893a39b4e2db10ec336489c71f2b537a7c65": "0a3173656976616c636f6e7331653373676a7733656b6e33646b79387678646a676e33636c39646668356c7239637a3770756a1091efe208189cae032200307c", + "0114cc7dc427a5ee1fea25236dbd78ab8f66db0aec22": "0a3173656976616c636f6e733165333775676661396163303735666672646b376833327530766d6473346d707a6d337977303318eecf052200308d01", + "0114ccc61d60e3dd1121bbbb2ea4c0039f91fd372389": "0a3173656976616c636f6e7331656e7270366338726d35676a7277616d39366a767171756c6a38376e7767756634386a736d7518eecf05220030d504", + "0114e1ca4bceb36e12283ccab4a844a97e0c050f005a": "0a3173656976616c636f6e733175383979686e346e6463667a733078326b6a35796632743770737a7337717a36396c7765726e18eecf052200309103", + "0114e557dd5ace79fc5c741275673cb35719f9137dcb": "0a3173656976616c636f6e733175347461366b6b77303837396361716a77346e6e6576366872387533786c777465666634713318eecf052200309302", + "0114e58f7a4f8e69795e1b0afff2a63c4555930f0cb1": "0a3173656976616c636f6e7331756b3868356e757764397534757863326c6c653276307a39326b667337723933307a6377793618ab8804220030ab12", + "0114f04b5b9c48b65604a1309e0b0046b4f7cf8c7ef2": "0a3173656976616c636f6e73313770393468387a676b657471666766736e63397371333435376c3863636c686a63347838323518d5dd01220030fe03", + "021400d66a1cb50a2473d8f011d369adb117a527072d": "0a3173656976616c636f6e7331717274783538393470676a38386b38737a38666b6e7464337a376a6a777065646a686d76676710e0cb061ac71400000000000000000000000000000000808080808080808020000000808080808080808004000000000080809080808080800400000000000000008080108080010000000000000000808080808008000000008080808080800200008080808080808080010000808080808080808002000000000000008080808080800200000000008090808080808044000000000000000000808080808020008080808001000000000000000000000000000000008080808080020000000080808080200000000000008020000000000000000000000000000000000000000000000000008080802000000000008004000000808080800400000000808080808001000080808080808008000000000000008008008002000000000000000000000002040000000080808080804000808080802000808080808080808040000000008080808080800100000000000000000000000000000000008180808080804000008080808080808080800100808080808180088080801000808001000080808080a080808002008480808080c04080808080801000808080808080808004808020008080800400000080808040808080808080808004000080808080808080100000000000000000028080808080808010008080808080800400000000808004000080808080808080808001000400808080808080880200000080010100808080804080808020000080808080804000808880802e00808080808080808001808080808080808002808080808080010080808080808010808080808090800200008080808080808001808080808080080080808080808080010000000000000000000000008080040000000000000080808080808080040080808080808080048080808080208082020000100001000000008001808080808480c4800480888280028880808201000000000000000000008080808082808080400000000000000000800200200000000000000000000080808080808080804000000000000000000000808480808040000000000000000000000000000080808080800480808080808080100000000000000000000000000000000000000000000000000000802000000080010000000000808080808080808080010000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080800400000000000000000088808080808080800800808080808080100000000000000000000000000080808080808080800200000000000000000000000000000000000000000000000000808080808004008080020080808080802000008080808080808080100080801080808080808080800100000000000000000000000000000000808080808080804000200000000000800800008080808080400000008080808080400000000000000000000080808080808080100000000000000000000000000080808080808010000000000080808080804080808080808080800200801c000000000000000000000000000000000000000000000000000000000000000000000000000000008004000000000000000000000000000000000000000080808080800280808080808080080000000000000000008080808080800100000000000000000000000000000000000000000000008280808080800280800400000000801000000000808080800800000000000000000000000000000000000000000000008040000000000000000000000000000000000000008080908080808080020080808080808080080000000000000000000000000000000000008080808080808008000000000080808080400000000000000080808080020000000000000000000000809080808080088001000000000000000000000000000000000000000000000000000080808020008080400000000000000000000000000000000000002080808080020080808080080000000000000080802000008080808080404000000000000000000000000000000000000000808080808004000000008080808080808002000000000400000000000000000000000000000080080000000000000000000000000000000000000000000000000e080000000000000000000000000000000000000000000000804080808080808080400000000080808001000000000080808080808001008001808080c00100000000000000000000000000008080808080808020000000000000008001000000008080808080808080020000000000000000808080808010000000000000000000000000000000000000000000808080800400000000000000000000000000808080808080808080010000000000000000000000808080801000000000000000000000000000000000000000000000000000088080800100000000000000000004000000000000000000000080808080808080010000000000808080010000000000808080808080802000008080808480400000000000000000000000808080808080010000000000000000000000000000000000000000000000000000000080800800000000a0800100000000108080020000000080808080808080800200008004000080808080808080088080808001008080808080800100808001000000000000000080100000000000000000000000000000000000000000808080801080808080808080020000000000000000000000000000000000000080100000080000000000000000000000000000000000000000000000808080808080800180808880a08004008080888180200000000100000000000000000000000000000000000000000000020080808080808001000000008080808080802080808080800200000000008180808001800800000000000000008080808080108080808080080000000000000000000000808080800200000000000000000000000000000000808080808080200000000000800400808080808080800400000000000000000040008002000000000000004000000000000000000000000000000000000000000000000000000080808080808004000000000008000000008080808080808080100000000000000000000000000000808080808080020000808080804000000000000000000000000000000000000000000080808008000000000000000000008080808080028080801000000000000000808004000080808080010000000000000000000000000000000000000000000000000000000000000000808080804000000000000000000080808080808004000000000000000000000000000000000080808040000000000000808080200000000000000080808080808080100004000080808080808020008080808080808080800100000080808080808008000000040000000000000000000000000000000000000000000000000000000000000000808010000000000000000000000000008080808010000000000080808088808080800600000000008080080000000100000000000000000000000000008080808080808001000000000080808080200000000000000000808080808080804080808080808080808001000000000000000000000000008080808080800800", + "02140ab238961abdbc7c99c6693765db290420e2ed87": "0a3173656976616c636f6e73317032657233397336686b37386578777864796d6b746b656671737377396d76387a303034647810e0cb061af315000000000000000080808080808080200000000000000000000000000000000000000000000000000000000000000000000000008080802080808080010000000080808010000000000004000080808080808004008080808080808002000000008080808080808040808080808080080000020000000000008080808004008080808001000200000000000000000000000000808080808020008080808080808080200080808080808480100000000000008080808080808080400000000080808080080000000000008080808080808010000000000080100008000000008080808080808080e0017f00000000000000008080808080100000808080802000808080c00200000000808080808080808002800400000000000000000000000180808080808080080000000080808008000000802000828080808080808020000000000080808080808080208080808080c01000008080808080808080100080808080848080100000000000000000000000000000000000008080804000008880808080800200008080020000000004000080808002000000808080808080808010808080800100000000000000000080808040000100008080400000000000808080060000008080200000000000000080808080010000000000000000000000000080801000000000000000000080808080808080802000008080808080808080f8010100000000000000000000808080808080808002008004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080040000000000000000000000001000000000008020000000000000000000000000000000000000000000000000803c000000000080800400000000000000000000000000000000000000008080801000008080040000808080800400008080808080808080200000000000000000000000000000000000a08080808080801000000000000000000000000400000000808080808080808020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080400000000000808080808080808001000000000000000000008080808080808080400000000000000080808080808080808001878080808080020000000080800100000000000000000080808081808080808001808080808002000000000000000000000000000000000000000000000000000000800100000000008080808020000000000000000000000000000000000080808080800200000000800200000000000000000000000080040000000000800200000000000000000000000000000000000000808080808020000000000000000080808080808080020000000000808080808080808008000000000000000000000000000000000080808080808010000000000000000000008080808080f8010000000000000000000000008080808080808004000000000000000000008080808080808080200000000000000000000000000080808001000000000000808080808080808002000000000040000000808080020000000000008004000000000000000000000080808080804000000000000000000000000000808080808080800800000000008080808001000000008080808008000000000000000000808080800200000000000000000000000000801000f80380800180808080804000000000008080a08080808080400080808040000000000000000000008080808080808080100080809080808080801000000080888080808080800200000000000000000000000000000000008080010000000000000080888080801000000080088080808008000000000000000000008020808080808080800200000000000000000000008080c0200000808020808080808080804000008080808080808010002000000000808080808080800800000000000000000000000000000000000080808080808008000000808080808080400000000000808080100000808080040000000080808002000000000080808080040000000080802000200000808080808040008080808080400000000080808002fe0700008080848080808280200000000080808001000000000000000000000000000000000000000000000000808080808080808008000000000000008080020000000000000000008080808080808040000000000000000000000090808080020080080080020000008080808080808002000000008080808080808080020000000000000000000000000000008080400280808010000080080000000000008080808080808080100000008080801000000000000000000000000000808080800800808080c00180808020808080808080808080010080010000000000000000000000000000008080808080808080108080808080808002000000808080808080808080018180808080c0200080808080800480800480808080808080e00f000000000000000000000000000000000000000080808010008080808080048080a0808080808008808080010080808080800200008040008080028080808080808080010000000080800400000000001800000000008080808080808080040000000080808080010000808080800400000080808080808080010000808080808080808040000080100080020000000000c880808080808002000000080000808080808080800800808080800200008080808080808008000000000000000080808020080080808080808080020000000000800880808020000000808080080080080000000010808080808080801000000000808080808010008080c00f000800000000008080808080800800010080808080808080400000808080040000000000808004000000008080808080808080400000000080808001808080808010808080ff0780808080800880808080808080808001000000000080800800000000000000000080808080808080c002808002000000808080040000808080808080808010808080808084040080808080820400808080808080808020000000808080808080040000808082808080808001808080808080080000000080a08080808080800100808008808080808082808010000080808080808040000000008080808010800800000080808080808080108080088080808080808080040000000000888220000000808080808080800800008080848080200000000000000080808080020000808080808080800100000000000000800100000000000000000000000000008080808010000000808080808080808002008003000080808080808010000000000000000080048080800200000008008080200000000200008080800280808080808010808080808080808080010000000000000000004000008080808080800100fe01000000000000000080808080808080804080808080808001000080020000808080808008000080801000000000000080800400200000008080808080808080040000000000000000000000000000000000000000000000000000000000000000808080200000008008000000000000000000000000000000000000000000000000808080800200000000000000000000000000008080808080808001000000808080bc8080100000000000000000000000000000000000000000000000000000000000000000000000000000000000808080c0ff0100000000808080100000000000000000000000000000000000", + "0214114c0350b9ce023f98518d9f22a2e2e7548daf66": "0a3173656976616c636f6e73317a39787178353965656370726c787a33336b306a3967687a756132676d746d7834616b6e7a3410e0cb061aa20e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808040000000000000000000000000000000000000000000008080802080808080800400000000000000000000000000000000000000000000000000000000000000000000008080200000000080808080808020808080808080808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800800000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808001000000000000000000000000000000000000000000000000000000000000000000008080800400000000000000000000000000000000000000000000000000000000000000000000000000000000000080800800000000008080010000000000000000000000000000808080808008000000000000000000000000000000000000000000000000808080800800000000000000000000000000000000008080808080808080010000000000000080808080808080200000000000000000000000000000000000000000000000000000000000000000008080808080808008000000000000000000000000000000000000000000000000000000000000000000000000008080802000000000000000000000000000000000808080808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080800100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080800180808080808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080020000000000000000000000000000000000000000000000000000000080808080808010000000000000000000000000000000000000000000000000000000000000000000000000008080808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800400000000000000000000000000000000000000000000000000200000000000008080800200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808004000000000000008080800800000000000000000000000000000000", + "02141394b86452a60711a0d3637e327d7d080a459b76": "0a3173656976616c636f6e73317a77327473657a6a356372337267786e76646c72796c74617071397974786d6b66653272377610e0cb061a820e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008008080808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808001000000000004000000000000000000000000000000000000000000000000000000000000000080808080802000000000008080808080808080010000000000000000000000000000000000000000000000000000000000808080808080808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808040000000000000000000000000000000000000000000008080808080808008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800400000000000000000000000000808080808010000000000000000008000000000000008080808080808080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080800200000000000000000000000000000000000000000000000000000000000000000000008080800100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080804000000000008080040000000000000000000000000000000000000000000000000000000000000000008080800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808001000000000000000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800200", + "0214183388665bac7d2537a91633fdc9ed5d6f46ef37": "0a3173656976616c636f6e73317271656373656a6d3433376a326461667a63656c6d6a306474346835646d65686b353670333610e0cb061a9819000000000000000000000000808080808080200080808080809080080000808080808004010000000000000000000000000000000000000000008080808080040000000000000080808080408080808010000000000000000000000000000000808080048040000000c080808091808082049d8890f08180904280a080808084800490808004000000804080808080808080801000000080808080808008000000804000000000000000008080808080808008028080800281808080808010808080828080400080808080808080808001000000008080808080800180808080048080208080808001808080802080804080808080808002808080808080208090808080808080020000000000808080808080010000088080800280808001000000008080808020808080808880040080801000000080808080e0ffff01008080800480808010008080808080080080808088800100808080808010000080802080808080048040000080808080040000008080028080808080808080010000008080820100000000000000808080808080801000000080200000000080808080800480808080808080100000008080808080808004008080808080848008000080808080808080808001008080808008000080808080808080040000008480808080802000008080808004000080040080800200008080804000808080808080808004000000000000000080808080808002808080800400000000808080100008008080808080100004000080808028000080800800008080080000000000000200000000000000000000000000000000000000800100008080208002000000008080808380808080080080808080808080808001808080040000801000000000808080808004000000008080808080800480fc1f0000808080808080808008000080808080040000000080800200808080808080020800000000008080808080020080808880800200000000000080808080808080400000808080c04080808080808080802000000000000000000000008080808080808080010080808080808080800800008008008080808020000000008004008010000000808080808080800880808080028080808080020000808080808080808040000000808080808080100000008080808001008080801000008004808080200000000000000000002000002000808080808080800200000000000000008080801000802002000000020000008080808080804000008080808080808080400080808080808002008080828010000080808280804000888080010080800480808010800100000000000000008080808080802080808080802000000001808080808080400000000000000080808080808080f83f0080808080100000808080808080801080808080808080802000008080808080040000000000808080808004000080808080808010000000000000008080010000000000000080808080808080800100000000000000000000000000000080200000008004000000000000808080848080801000000000000080808080208080808002000000000000000080808080808080100000004000000000000000000000808080802000000000000000000000440000000000000000000000008080808060400000000000000000008080808080040000008080808080808004000010008080808080804000000000008020000000000000008080808080800100000000008080808080808080f8011f0000000080808001000000000000000000008080808080808080200080808008008080808080100000000080808080808080800800008080808080200080808080808080801000000000808080808080808002000080808010008080800480808080808080801000008080808080040000000000000080800400000080808080800180808080801000008080808090804000008040000000808080808008808080808001000000808080200000808080808080804000000000808080808004000080800800c0808080040080801000008080808080808080100000808080800200808080808010008002808080808080808081018080808080808020000080808080400000000080808008808080804000808080408080808080808020010080808080a02000000000000080808480c08102000000008080808080804000008080808008000080808004000000808080808080808010828080a08080808001020080808082808080208080808080808080018080800180c0808080808001808080808042000080808080808080c0018080c020808080948080408080800100008080808080808080028080800400f0ff010280808080808040008180808080808080100000018020000000808080808080808080010080808080808080804200000000808080800800000000000000008004008480808080808040808080040080808080808080088080208080808080a01000008040000000808084a08085848080018086829084a094c04081a08080828082040080800280028080808080808080010000000000008080808080800480400000000000000080808004008080400000000080808020000000000000804000000000000000008080808020808080080000000000000000000000000000808080801000100000808080808080200000008080808080808008000000008040008080808080400000008080060000000000008080808080808080408080808003000000000000000000008080010000000000008080808008000000808040000080808080fe8180801000000080808080808002000000000000000200000000000000000000000000000000000000000000808080808080800100000000048080100000000000000080801080080000000000000000000000000000008002008001000000000000000000000000000000000000008080808080040000808080808080800800001080800600000080108080808028000010000000000000808080808080800200000000000080808080801000c0018080400000801000000000000080808080808080808001808002808080808080108080808080808080010000000000000000020000100081808080808040008080808001808080808008000000008080808080400080808080808080fe018080808080808080200000000008000080020000000000000000000000000000808080808080080000000080800400000000000000008080808080808010000000000000000000000000000000000000000080808001000000000000808080808002000000000000000800000000000000008080808080808080020000008080808080808080600000000000000000008004000000000000000000808080808080808004000000000080808020000000008080808080801000008080808080808008808080808002000000000000808080808080800100000000000024000000000000000000008080808080800c00008080801080808080808010008080808080806080808080808010008080808080f803000000808080800800000000000080808080808020000080010000c080808080801000000000100000000000080000000080808080808080010000000000000000000000000000000000000000000000008080800200000000000000000000000000000000000000008080808080808001000000808080808001000000000000000000000000100000008080808080808080011080804080808080808004008080808080801000000000000000000000008080800100000000808080808080808004000000000000000000000000808080808080808010000000000000000200000080840800000000808080808080800c001000000080803f000000000000000000000000008001000000000000000000000000008080800400008080100080808020000000000000000000000080808040000000000000000000808080800100400000800400000000000000000000000000000000000000000000000000000000000000000080808080808080100000000000000000000000000000000000000000002000000020008080808080f0ff070000000000008080808080800800000000000000000000008080820100008080010000000000000000000000000000000000000000000000000000000000000000000000008080808080808080208080808080020000000000000000008080080000000000000000000000000000000000808080a080020000000000000000801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080020000000000808080800400000000008002808080f07f808080080000008880808080800200808080808080808010008080808002000000008080808080808008000000", + "02141aefcc514e41f3dd21f5ce20b7ba3d142eb56256": "0a3173656976616c636f6e73317274687563353277673865613667303465637374307733617a73687432636a6b75686678356810e0cb061a991f8080808008808080808020008080800400400000808090808040808080808080800300000000000000808080800880808080060080808080018080808010008080808080400080808080808020008080888080c0030000808080020000000000808038000000808080808080808080018080808080808004000000808080808080800e0000000000808080c040000080808080600000000000000080808080800100000000000000008090804000000000000080808080808080800480803000008086808080808080080000008080808080808008000080808080800480808080801000801800008080808080010000808080808080808001008080048080808020808080808080808006000000808080808001000000808880808020000000802000000000000080c0010000000000000080808080808080800c00808080808010000000000000808080808080800c000000000000000000808080808180808080010100000000008080808080808030808080808080800100008080808080808080800181808080808080804000000000008080808080408080808080808080e00110000000000000808080806000000000808080801000000080808080808004808080808080808040000000000000008080808080808010000000808080808080808030000080808080804000808080808020000080808082808080801000808c808080010080808080808080808001000000000000003000008080808080808020000000000080808080808080c0010000000000000000008080808004806000000000000080808080801c0000000000000080808080800400800e008080808080808080a001fdffffffffffff018080b0808080800602c08080888080d0018080c080808082288080018080808080802000808080088c800200808080803000000000000000000000800480808080808060000000000000000000008080808080808080800183808008000000808080010000000000000000808002000000000000802000800c0000000000808080808080801c000000808080800800000000000080808080808080806000000000000000000000808080803000008080808080804000008080808080808008001000008080818080801000010080808080700204808080808b80808002808080808080200080808080808006888080408080800c008080200081808080808080c001808008000080808080040008801800000400000000009080800480808008000080808080808001008080808080808080800180808040808080808110000080804000808080800100808080808080088080f001000000000000008080808080800800000000000080808088808080010080c0800280028080040000808080808082800280808080808020008080808080028080048080808080809060000080808088808080808001c08080808080808020808080808080800280808080808080800280800400808080808080088080e08080814080c080c08710808080800200808080800680808480c0508080808080808080208081808080808003809001808080808020008080808080c0018080808080208080c0ff04808080802000000080100804808080808080802080048004808080808008008080806000808080018080808880801080800680808080808080800480808080a08080808001800280808080808080088080808082808080208080808080808080800180808080018080808080808080018080c0808080c280010000808080c081808080c0010081808080908080408080808002804080800100818080c0048080808c8080808020108002002080808080808010080080018080804080808080e00180040000408080808080042100e08080808080900180800800808080808080108080808080808080180010000000188080040080848080808080804080808080048080800880b08080808080800880808020808080808080801080808080808080080080804000008080808080808080608080808081c0810c808086808084a0108080a08080808080040080808002800380808080808080801000008080808080800400000080808080a0808004808040000000008080808080808080180000808080808080800400808080400040000000004018808080808008000000808080409080808080808080f80172808080200000888080e080018080808080100080e08080080080808080808080380000808018008080808040000080808080020000000090808080808180800800809080808002808080808080808006000000000080808080808080800880808080800100000080804000808080808010000080808080808080608081808a800c00808080808080808230000080808080040000808080808093200000008080180000000000008080800180400001000080808080808080800300000060808080408080020080808080808080600800008082808080808002008001000000000000c0808080800300000000808080808018000000808080808080800200000000808080808080808020000000000000008080800c000000008004000000801800000000008080080080088080804000000000000000000000808080808080c001000000008020000000000000008080800800400000000000808060808080808080808008000000000080808080808080068080808080040000000000000000008090808010008080808080808040008080808280800200000000808080808080c00300808080808080080000000000000880800300000080808080108080808010008080808080808080800100c0808080e0800880828080808080100080100080808080030080808080808080210000000000808080800880f00700fc838080808880400080806080c001808080808080600000800300808080808080808080010100108080300000008080808080808080800100040000000000800e000000008010808080808040000080808080808080080080808080808080400000000000800300000000000000000080808080808080804000000080808080808080a001808080f080400000008080808008008080f00700010a000000808080808018808080808080800800000000000000000000008080808070800800000080808080808080808201010000000001808080300000000080808080808080400000000080808080b080808006008080040000000000000000808080808060808080040000000000000000808003008080808080808010000000000010808080010000000000008080030000000000000000008080808080810600000000000000008080808080808070000000000000003800000080800200800800008080808080808030808080808006000080808080808080020000808080800c00808080808080808002000080808080808480080080808080188080800200008080808080808018000000000000000000000000808080808080030000008080808080808080f8018380808080801980808080800700000000000000000000008080808080808010000000000000000000008080808080800c00000000008080c0030000808080808080400080808080808001000000a0808080808080801800000000000000008080808080808080c0010780c00300008080700000068080808080808010000000000000808080808004008080808080808080c001010000000000000000000080600000000000000000000600000000000000000080808080808080800c80808008000000000000809080040000000000000000008080808080808080e0010000000000000080808180808080800400008080808080801c00000000808880808080802000000080808080808080800c000000808080808080800200000000008080c00100000080808080808080800400c0010000808080020000000000808080c00100000080808080a00100000000808004808080808080028080808086808020000000808080200000808080e00200808080808078000000000000000000000080808080808080800e008280808080800f88a08080801000808080808080808002008080808080808080408080808080804080808080080080c00700000000008080808080300000000000000000000000802000000080a08080d0808080600000000000808080080000808004000000000000008080804080808080802800000000000000002080808081808080808001808080808080808002808080808080808006000000000000000000803000000000000400000000808080808080803800000000000000008080808080800200808080808080800e0080808008000000808080400000008080801800000000000000000080808080100000800700000000000000008080808080800200008080200080808008000000808080808080808080010000000080808084808008000000808080808004000000000080808080808080803000000000000000000000800c00000080808080808080802000000000000080802000000000000080808080804000808880c08002808080808080188080808080200000808080208080808080040000808080808080808008000080800200808080800800000086a880808080800200000000000000000000808080c0010080808010000000804080808080808008000000000000000a00000080e00300808080808010000000800200000080808080030000000000000000000080808080802000000000000000000000808080806000008080808080808004000000000000008080808080808080030000000080808080808080080080808080808080800800008a81829180d080400b808080808010808080808080803c80808080808080048080808080808080c4010000000000000080808010000000008080808080c001000000000000808080400080a08080801080808080a08080802000008080808081804000000000808008a0808010000080808080803000008080808280808202000080808080808040008080808080c001008080088080808008000000000000008090808080060000808080801000a080808080800480808080808010008080808080c0018080808080808080400000008040808080802080080000808060000000000000008040000080808080388080808008000000000000808080808080808030000000008080808001008080808004808080808080800800808080808080c003000000000000008080804080300080200000808080808080020000004080801800000000008040000000008060000000040000000000008080808080801880804000000000000000800200000000808080e003808080808040808080808080804000000200808080400000000000808060000000000000008086088080808080808060020000000000000000008080a080808080800300008080808010008080808080808080200000808080808080200000808003", + "021425abc30b5e07afd6ca59eaa3495ac44d6b5c3026": "0a3173656976616c636f6e7331796b3475787a363771376861646a6a65613233356a6b6b7966343434637670786a6136667a7610e0cb061af81800000000000080808080808080040000000000000000008080808080802000000000000000000000000000000000000000000000808010000000008040000000000000000000000000808002000080c0ffffff3f000000000000000080808080100000000000000000000000000000009080a19884e190842384a180c4b084c3080080808008008080808084e1988c6384c3f8cee3908482318ce1908cc2a19884338483c2b18cc2b088429884a19884e3908ce2019884e190c2b18ca38601b188678080808080e3b80400000000000000000000000000000000000080808080808020000000808040000000000004000081808082c08008000000008080808081908080018880808080208080a08c808880c0208080f0808081108086c1808084420080f0b89e06000000000000000000000000008080802000000000000000808080808080808040808080888080804080c08004000000808080808080c08008c3a1808090808098048884c1808080042080802180802180808080c0e1b8040000000080040080800880800800808080400000000000008080804000000000000200000000808080808080c00100008080808080808020808080808080808010808080808080b0080080808080808080800100010000000080808080808080f0ff01ffff1f00008080400000808080802000000000000000000000808080018040808080400000804000000000000000000000000000000000000000000000000000000000000000000000008080808080108080808080800200000000000000000000000000000000008080808080400000000000000000008080808080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808010000000000000000080808080848080020000000000000000000000000000808080808080088080ff3f000000000000000000000000000000808080804000000000000000000000000000000000000000008080808080800100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000808080808080808002000004000000000000000000000000800100000000000000000000000000000000000000000000808080808020008080808080808080800103000000000000008010000000000080808080100000000000008080808080808040000000000000000080808080808080fcff010300000000000000008080808080808080200000808080808080800886848080808008000000000000808080800100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080800400000000000080808080800200000000000000000000000000000000808080808080040000000000000000000000000000000000000000008006000000000000000000000000008080808080808080020000000080808080808080800200000080a080808080800c008080808080808080010000000000000000000000808080801000000000008080f8ff7f00000000000000808010000000000000000000000000000000008080808080040000000000008080800200008080808080c0bf080000000000000000000000000000000000000000000000000000000000008080808080808080200000000000001000000000000000000000100000008080808080808080080000008080800200008080808080040000000000008120000000000000000000008080808080010000000000000000808080804000808080808004000000000000800800008080808002000080808080080000000100000000e0808080808080800280808080808004000080808080808080808001010000000080808080c0ffffffff01838080800800000080808080808080800100808280808080201000000000000000800100000000000000000000000000008080808080808080040000000080808080808080c0118080804000000000000000808080b98080020080020000804080800400000000008080808008808080400000000000000080808080802080808084899088e2108003000000808480808481b080408884e08880a08084408086a19884c3a18880019088c28080a180800188808088808180826000808098c6210000808080010000000000000000000000000000000000000080200000000000000000000000000080808080088080808080080000808080801000008c82808080808001000000000000000000000080808080801000000000000000008080020000000000000000808080f8ffdf010000000080908880c1a08880418082a1908880c08008c3808882b084c0a104f1808880b08882e01080c1b080a08884c010800180848088c66300000000000000000000000000000000000000000000000000000000000000000000000080808020808080808010808040000000808080a08088808020808083808080800880808060048080c0801080808080808080900400000000000000000080808080080000000000000000000000808080400000000000000000000000000000000000000000808080c020000000000000000000000000000000000000000000808080808080801000000000000000000000000080808080800280808004000000000080100000000080808080842000000000000000008080808080e0ff0100000000000000000000000000008080808080800880808080a0108080808080808080100080a0800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808001804000000000000000000000000000000000000000000000000000000000000000000000000080808080800480208080808080808001000000000000000000000000000000000000000080808080808004000000000000000000000000808080808020000080808080808010000000000000000000000000808380f0ff8380200000008080808004000000000000000080c69cc7f1ccb3ce338ef39ceff398c6f38c01f79ce7b9cee39d8611c090c48188e3b0842380b080c08084a380318ca198c2908ce7910480a19cc49084a198c60190b1888088c7b18e3bee98e7bbc6fb9ce79901e3b8def39ccef39ce70198c698c6b3cee39cc60198c7b99ce7b9ce99c601dcf38ce398c6f19c71cef39de7bb8cb398c6019ce798c6b18ce7b18c01b9cebb8c8180808822808080a088f39def8c017f0000008c42000000000000000000000000000000000000008080060000000000000000808080808080804084c3b088c2909ca318c3a08cc398840100800400808080808088a1908401b08cc2b18ca18886618cc3908cc3908c82218cc3b084e39886c318c3819cc6f384a3cc63988cc2908cc2a188c601b08cc3b084318080808080808080cf01b98e010000000000800800000000000000000000000000000000801080200000000000000000000000008080808080808080028080808080808080800100000080808080808080800180808080a08880c31082a1908880808082208481908c828880a018c380808081980480809084c2a18088018804b08080c08781e3090000000000008080808080808080200000000000000000808080808080010000000000008080800400000000000000008080808080808080fc019f20808080c2b1c4e1888401b08884f188c6a38886019088c6018080808080808080820110008080c4c7a08ce6984498c6f19884c3908c46b88cc2908cc3b18c619886e1988cc3a18c8601b088c2b186e39884c301f99c8ee3b0b89ee11886a99886f19880800180808080808080c0639c86030000000000000000000000000000000000000000000000008080808080808020c08084e19088c2900ca18886a09884808030068080808080a08080020080809080c09086e11980c1a09098c280888601a09884c08088c0a008c3909cc2a1988482418886c1a08884c18008c0b09884c190880e000000000000000000000000000000000000000080840e0000000000000000000000000000308090808080808080400080400000000000000000000000000000000000000000000000000000000080808080f8ffff0f00000000000000000000000000000080808080a088802080808880819080c00300808080808080808010008080808080808008908c8281808420a09080c180888480218084c03082a1908002a08080c6a3908884c3010180809c844300000000000000000000008080808080808040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0214314e76481bdea52cea72a30bc185b14f97e7e1d5": "0a3173656976616c636f6e733178393838766a716d6d366a6a65366e6a3576397572706433663774373063773432703775327010e0cb061afb18000000000000000000008080808080808080200080808080801000000000808080801c0000000080808080808020000000802080feff070000000000000000000000000000000000000000000080808002808080808004000000000000000000000080808004000000008880808008000080808080808080801400000080808080800800000000000000000000000000000000000000000000008080808080802000000000000000000000008080040000000000000000000000000000000000000000200080802000000000808080808080801000000000000000808080808080800200000080808080040000808002008080808080808080100080808080808020008080808020000000200000808880808080700000000080808080800800808080808080048001000000000080802000008080e0ff7f000000000100000000000000000000000000000000000000000000000000808080808010000000008080808080808090400000000080808080808080882080808080808080808001000000000080808080804000008080808080808080100080808010000000808080800280808080808080804080800100000000000000000000000000000000000000808080808080c080080000808080800400000000000080800480808080400080808008000000000000000000808080020000000000000000000000000000000000000000000000808080808080808010000000008080808080804080808008808081808020000000808180c083e0a08008b88080e08180b0048080808080808008a28080881000000000000000000080808080808080040000008080808080ffff07000000000000000004808080048080808080802000000081808020000000008080808008808040000000008080808080804000000000000000000080808002808080040000000080808080808080800100008080808080808080040000000080408080808080200080808020000000808080808002000000000000808001000080808080080000008080040000000000000080808080800180808004000080808080808080800200c08080808080801000008040000400008080808080208080808080808020000080804080808080808080080080808080800800000001008080808080010080808080808080080000000000008080808008000000000000808080808040808080800100808080808080808008000080808080808080040000000000808080808080848002004000000080808020008080804000000000008080808080c00102008080808080800480801000000000808080808080fcffff0101000000000000808080808080020000000000000000800280808080808080800200000000000000000080804000000000008080400000808080080000000080808080800c00808080808080808010000000000000000000808080808080808010000000000000008080040080808080808004100000000000000080809080808410000080400000008080808080808080010000808080808001808080808080808040000000000000000000000080808080808080c0020000000080100000000000808080808008000000000000808080808080801000a0808080800401000000808080808880300080c083808080200000000002008080808080808002008008808080400000008080800400000000004000000100000000008080808080c001808001008080808040000080808080f0ffff0f0080808080800600808004000000000080808080808080010000000080808080808004000000008080040080808002000000808280808040000000000000000080808080808040808080808080801000000080808080800100000000000000000000000080802080808080808080200000808008000000000000000000808080808080200000000080010000808002000000000000000000000000000000000000008080808080802000000080400000000080080000008080808050008f80800800008080808080803000000000808080800400000040e00100000000000000000000008080c00380020000000000000000000000808080808080c001808080808080801080808080800100808080408801040000000080c0ffff03000000008080808080880400000000000000000000000000000000808080808080800800008080808080040080808080808080010000000000000000000000000000000000000000000000000080808002000000000000000000000000000000008080808080801000808080808080800180808080808080801000808080808080800480808082808080802080808080808018001000000000000000000000000080808080801c808080808080808010000000000000808008808090808080808008000000008080808080808080020080808080208090808080808080100000000000808080808010808080808002000000000c8080808080808040000000008088800200808080600080801000800180808080808080808001000000808080808080848020808080808040808080800c8080808004008080808080a080e00100800c808080808080808002818080808080804080808080808080208080f08080808007808c8080800100808080808010000080808094c0ffffff0380808080808002801e8088808081808080088080808080808040022000800580808080808080800600e080800100008080808080010080808080808080802000808080808080400000000000000080818280808080800200800200848080400400808080808080804080808480808080800200000000008080808080808080018080804080808080808098018080400080028080808080808080048080800880808080808080c04080808080808080400000008280808080a08080200000828080808020000000000011808080808080808084010000006000808080808020008080808080808080400000000000100008000080808080808080308080408080808080806080808020878080808020000000008080febf808a98a01080888080888088808101828080808480800800808084808080808010000000000080808080808080804000008080808080800880800300000100000000000080808080808080800400808080808080808080010000808080400080801800808080808040808080800200808001000000000000808080808080808030000080808080808080800200000000000000000000000000808080808080808040808080808080feff030000000000000000000000000000000000000000000000000000008080808097800100000080808004000000000000000000000000000000000000000080808080808080802000000080808080808004000000000000000000000000000000000000000000000000000000000000808080808080800200000000000000000000000000808020801000000000000000000000000100000000000080808080808080800100000000000000808080808080808008000000000000000000808080808080808080018080808004000000008080808008000000000000808080801000000000008080e0ff07c001000000000000000000000000000000802000000000008080808080808080020001008080808080808080020000000000000000000000000000000000000000000000000000000000100000800480808030000000000000000000000000000000000000000000000000808080800200000000000000000000000000000080808010000000000000000000000000000000000000000000000080808080808080801000008080800400000000000000000000000000010000000000000000000000008080808080ff07008080808080808080088080808010000000008080804000000000000000008080808080040000000000000000000000008080801008000000000000002000000000000080808080808020000000000000000000000000000000008040008002000080818080808020000000000000000000001000000080804000000000000000008080808080800800808080804000000000808080808002800c0000008080808080808080200000008080040000000004000000000000808080800800000080020000c00100000000008080800800000000000000000080800400000020000000000080808001808080808080080080808080e0ff2300000000000000000000808080808080808002808080020000000000000000000000000000000000000080808080808080100000000000040000000000000000000020000000000000000000000000000000000080020000300000000000808080808080801000000000000080801b80802000000000000000020000000000", + "0214399548ff09159af3711df1ef08cc243c505130b6": "0a3173656976616c636f6e733138783235336c63667a6b64307875676137386873336e7079383367397a76396b39753773797a10e0cb061a861200000000000000000000000000008080808080808008000080808080800400000000000000000000000000000000000000000000000080808080808080800400000000000000000000000000000000000000000000000000808080808080400040808080808080804080808080800481808004000000000000000000000000804000000000008080808080808080e001ffff0f8080ffff0380808080808080080000808080808080feffff01ffffffffffffffffff010700000000000000000000000000000000000000808080808080010000000000000000000000000000000080808080808080801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080018080fb07808080f0ffff010020008080808080808080c001ffffffffffff83c401000000000000000000000000008001000000000000000000000080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080040000000000000000000000000000000000000000000000000000000000000000000000000000008080808098148080808080c0030000000080fef8ffffffff81c00100000000000000000000000000000000000000000000010000808080808080200000000080808080400000000000000000000080808080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808004000000000000008080808002000000000000000000000000000000000000000000000000000000808080808080808004000000000080808020440000000000808080808080809f028080808080808080f801038080808080808040008080808080800280808080e0ffffffff01ff9fa00c40000000000000000000000000000000000000000000000000000000000000000000000000000080804000000000000000000000000000000000000000000000000000808080808001000080808080802000000000000000000080808010000000000080808080800400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800880808080808001fd3f80803e00000080808080a0808080fe01ffffffffffffff7f000080804000000000008080808080808080080080808080808020000080808080080080806000000000008080808080808080010000008080808080808080010000000000000000804000000000000000000000000000000000000000000000000000000000000000000000000000000080802000000000000000008080808080800401000000000000000000000000000000000000008080800400000000000080808020000000000000000000000000000000000000000000000000000000000000000000000000008080fcff0180808080fc0f00000000f0ffffffffffff81320080400000000000808004000000000000000000000080808002000000000000808001000000000000000000008080400000000000000200000000000000000000000000000000000000000000000000000000000080808080808080010000000000000000000000000000000000000000000000000080808080808080808001000000000000800100000000000000000000000000808001000000008080808080808080400000000000000000000000801000000000000000000080808080e05b8080808080803d008080808080808004000080c0ffffffffffff83011900004000000080100000000000000080808080800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080080000000000000000000000000000000000000000000008000000000000000000000000000000000000000000008004000000000000000000808004808080808080805f8080808080808080fe010300000080808080ffffffffff01ff811800000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808008000000008080080000000000000000000000001080808080808002000000000800000000000000000000000000000000000000000000000000808080020000808080808080080000000002008080808002000000000000000000000000000000008080808080400000000080808080808080804000000000000000000000000000000000000000000000bc0180980f00000080808080808080f07ff8ffffff9fe006808080808080808001000000000000000080808080808080802000000000000000000000000000000000000000000000000080808080804000000000000000000000000080808010000000808080808080208202000000000000000000000000000000000080808004000000000000000000000000000000000000000000000000000000000000008004000000000000000080808002000000000000fe7f8080fe0700000080808080808080e0ef01ffffffffbfa00c000000000000000000008080800200000000008002000000000000000000000000200000808080808004808080108080802000000000000000000000808080108080808080800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080feff0f80808080b01b0000000080e0ffffffffffffff01ff9e03000000000000000000000000000000000000000000000000008080808002000000000000000000000000000000000000000000000000000000000000", + "02143d4ceb152ca0271e5a9af577d67c828a228c87df": "0a3173656976616c636f6e7331383478776b39667635716e33756b353637346d61766c797a336733676570376c75356363397310e0cb061a9311000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808040808080808080048080400080808080808080802000000000000000f803000000000000000080808080800200000000000000000000000000000000000000808080808004808080010000000000000000000000000000000000000080808080808080208080808080e0ff7f00000000000000000000000000000000000000000000000000008080808080010000000000000080808080808080010000000000008080808001000000808080380000000000000000000000000000000000000000000002000000010080808080808080804000000000000000000000000000000000808080808020000000000000000000808080808080802000008080200000000000000000000000000000808080808080808020000000000000000000000000000000000080808080808080800200008080808001000000008040000000000000000000808080c0ff0180800200008008000000000000808080801000000000000000000000000000000000000000000000000000000000000000008080808040808080808080200000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808020000000000000000000000000000000000000000000808001000000000000000000000000000000000000000000000000000000000000000080800180808080800100000000000000000000000080808080f83f000000802000000000008080802000008080040000000000000000008080808080800800000000800800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000808080800700000000000000000000000000000000808080808080a0e003000000000080808080808080010000000000000000000000000000000000000000000000000000000000008080200000000000000000000000000000e0bf8080800400000000000000000000000000008080808080808040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080208080808080808080040000000000000000008080808080808004008080808010000000008080c002000000008080808080808002040000000000000080800100040000008080808080200000000000008080022080808080808080808001808080808080808080010000008080808080808020008080808080802080808080c01000000000000000000080808001008080808480808080800100808080808080108080808080100000000000000000000000000000008080808002808080808080fc1f0000000000808002000000000000000000000000000000808080808080808020808080848088808040808080c080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080200000000000000000000000000000000004000000000000000000000000000000000000008080e03f00000000000000000080804000000000000000000000000000000000000000000000000000000000000000000080800e00000000000080808080808080fe0100000000000000000000808080801f0000008080808080802000000000000000000000000000000000000000000000000000000000000000000080808080808080100000000000000000000000000000000000000000000000000080808080808080100000000000000004000000000000000000000000000000108080100000000080808080800f000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000f801000000000000000080800100000000000000000000000000000000000000000000000000000000000000000000000080808080400000000000808080808080800100000000000000000000000000000000000000000000000000000000000000000000000000000000808080080000000000000000000080808080808080f0010000000000000000000000010000000000808080200000000000000000808080808080040000000000000000808080800200808080800840000000808080808080080000000000100080808080801f000000000000000000000000000000000000000000000000000000008080808020000000000000000080808080808002000000000000000000000000000000000000000000000000000000008080808080808080100000000000000000000400000000000000000000000000000000000000000000000000000000780000000000000000000000000000000080808080808080808001000000000000000000000000000000000000000080808004000000000000000000000000001e000000000000000000000000000000000000000000000080808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f80100000000000000000000008001000000000000000000000080808014808080080000000000000000000000000000000000000000000000000080808080808080feff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080020000000000000000000000000000000000000000000080c003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000808080808080fe0f0000000000000000808080808080808004000000000000", + "021440f909929f7fa9d475e2c6f5a94ac9d6d97cf83d": "0a3173656976616c636f6e7331677275736e79356c303735616761307a636d36366a6a6b66366d76686537706174343036773010e0cb061aa4180000000000000000000000008080a0808080200080a08080808080088088808080408002001000000000000000000080808080808080081000808080808080800880808080808080804000008080020080408080800200000080808080808004808080808080800880808080802000000000c08080808080080000808080800800808080808002808080808080068080808080808010808080808080808004000c000000808080800800008080808080801000000080808080808480028080108080808080808040000400008080808080040000808080c0ff010000000000000000000000000000000080808003802080808082808080801000808480808181b0b0109c8c848683a0b090188c80838281c181c030b88c868682e1c3e0609090988082828282810180809880808008008080a0802000000000000000000000000000000000000000000000008080808080808080020080c08080a0a0a0a02080809a80808484800280a080809090901080a4018880888080100000000000000000000000808080800400000080808080040000000000000000000000008080808008008080808080c0018080808080108080808080048080808080010080808080030080808001000000808080c080048080802080808080208080808080800100000000000000000000808080808080808008000000000000808010000000000000808080808080808004000480020000008080808080808002000000800100000000000000808080400000808080808004808080808080400000008080fc1f0000802000000000000000000000000000808080808080010000000080808080060000000000000000000000000000000000000000000000000000801000000000808080808004000000000000000000000000000000000000000800000000000080808080808080800100000000000000000000008080808080808080200080208008808008808080088080808004808080808004000080808080808080800280808080808080100000000000000000000000000000000000008080808080808080040000000080800800000000008080808080808080080000000000000000008080800400808080800200000000808080200000000000000080fc01000000000000808080100000000000000000000000000000000000000000000080808001008080040080010000000000000000000000000080808080400000000000000000000080808080100000808080808080801000000000008080800100000000000080808080808010000000000000000000000000008080808080808080018080808020008080808080808080048080808080808080060000000000000000000000000000000000000000000000000000000000000080808080200080808080800400808080808080802000808080808080808020000040000000008080808080808080068080808080808080040000828080804000808080808010008080060000000000808080808080801000000080808080808080fc0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808020000000000000000000000000808080018080200080808080808010008020000000000800000080088080200000000000000000000080808080808080800100808080080080808080100000008040000000808080808080801080808080808080800880808080808080800400028008808003000080808080020000000080808080100000000000808080808080800380808080808020000200808080800280808080020080812000808080808080f80f000000008004000000000080808080400000008180808080808008000000000000000080800400000000000000000000000000000000020000000080808080808080018080808080400000000080808010000000000000000000000000000000000000000000000000008080808008000000000000000080808080c00100808080801080808080848080804080808080028080808001808080200000000002000080c09f878080c4ffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffbfcef3bcde01f3fde6f3bccff3ffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffffffffffff01ff9f81b8b8b1e9d0a801e1c7b9f88780800481bdf0ff80800480fa87e0801880808080801880808080408080808080408080808080801080808080808004801080808080808020008180808080808004000000014080808020008080188080801080808002000000808080804000000000808080808002808080802080808080808080800880808080800280808080808080208080808080a0808020808080808088808008008002c08080800280c0018080808080808003800800008080808080808080088008e001808080808080808020808080ff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080802080023000008080808080800e808080808080040000000000000000000000000000000000000000000000000000000000000000008080808080020000000080808080808080800c0010802080e08080808080018080808080808080010000808080808080808020808080808080808018000000000080808880808008808080b080808080088080808080808080c00100008080c01f000000000000000000000000000000000080800200000000000000000000000000000000000000000000000000000000000000000000008080808080808080800100000000000000000000000000000000000000000000000000000000000000000000000000008080801880808008008080800400808080808080800c0080808080068080808008008080808080801000008080808080808004000000000000000000000080808080808080800200000000008080808080060080808080808003808080808040000000028080808080400000808080808080808020000080020000804080c00100000000008080808080808080048080808080801000000080808180808010808080080000808080c00300808080803e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808003808080808080068080808080800780808080806000808080808010808080808008008280808080808080800100000000010000808080808080801000002000000000000000000000000000808080108480808040000000000080808080020080808080800880808080800480808080808060808080808080808006000c04040080808080200000008080808080888008000880408080800480808080108080808002000000008080e00f000000000000000000000000000000000000000000000000000000000000000000008080808080400000000000000000000000000080808010000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808001000000000000000000000080808001000300007c000000000000000000000000000000000000000000000000000000000080808002000000000000000000008004000080808080808080200000000020000000000000000000000000000000000000000000000000000000000000000000000000000080808080208080808002000000008080208080808080808080010001000000008080808080808080400000000000000000000000000000000080808001808020000000000000000040008080800280808080048080808001000080808080020080808080888080801000808080808080028080808080808001808080808080040000000000000000000000000000808080807f0000000000000000000000000000000000000000000000000000000000000000000000008008000000000000000000000000808080800100000000000000000000000000000000000000000000000000", + "021459e78e0b1133144460575337faa2558399e43661": "0a3173656976616c636f6e733174386e63757a63337876327967637a6832766d6c34676a347377763767646e7039356c366c7810e0cb061a861f0000000000000000000000000000000000000000000000000000000080808080808080080000000000000000000000000000000000000000000000000000000000000000000000808020008080808202008080808080800180808001848080c080c080802080888088c0a0804000008080808080808080800180808290c08081800181808080802000808080808080100000008080808080808084408080808040008080a0800880c0808080802000808080808080208080200080808001000800808090808080802080908080801080808080800480808080808001008080808080800880808080808020908080800800808080808080801000080000888080800880808280808081800200808082808080808001008080808080808082020000008080808080808440808080808080010080808080808080800880904040000080feff7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080c001000000000000000000000000000000000080600000000000000000000000000000000000000000000000000000008080808080800284808080808184108080808080809040808080808080808080018080808080808002808080808080088080808080802031c08080048080800480808080088081904084808090208080808880808001808081802000000100808080800180808080088080808040080080808040000000000000808080808080088080808080888080088080801080808080808004008080802000008080101000808080808090800400818080808080802080808080808080804000008080808880808010008080808080100000008080808080080080808001001000008184808080808008000080f83f00000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008004000000000000000000000000000000000000000000000090400080808080808082088080808180808080800100108080808480808080400000a080808280208090a0c080808080100080808080808080811080808080808010808080c080080080808082808004000000808010808088c080808080108080088080808080400000108080808080808008808080808010808080808080a080208080801000000000000200000080a080808040008080808080808008008280848080800880888080802080808080c080200000808040008080018080808080808080200080808080800400000080828080848080040082808002808080808410000080808080f81f0000000000000000000000000000000000000000000000000000000000000000008080808080c00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808004808080c0808080802080808080881080808080108080808080808040808088a080800420008080808080800881808080808008008080808080808484089080808090808001808080800280808080808080048080808002c08080800200000080808080808080108090808080819080028080808080808001800280809080808080808001000000000090808080804000808180808080800800808080802000d08080808080804000008080020080808080c0808020008080808002008080808001000400808080808080018001808080808002808080808010a08082080080808080888080048080208080808020808080888080408080804000808080808080808002848080808090100000808080808080fe0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008006000000000000000000000000000000000000000000000000000000008080808080c080028080c08080848010408280908080808001808081841080808080808004408081828080808008c080a020808020808080808080408090808080802080808080808080088080808080a02080808080808080801080808080040000808040808080809040008080108080c08090808008818080888001a080808080a0800480808080808004008480808008808080809080800880848080800140808080802080c080808080c0808001808080808080804091808010008080908020808080108080808080400080848080808080800280828004808480081080806180c08080808080048080808081808080200080804080808080808080800280808080808080804000808080808080800480a0808040008080010080808080848002000080808880819080028080808020808001808080808010828080808104000080808080fe3f0080808080808080800100000000000000000000000000000000000000000000008080808080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808001008080800280808090c080028080808080800180a0808080848020808180811080808080841080889080c080800280808080828080800280a0808080808040000080808080028084802000908082a080048080809080822080808080808088800180208880808080808080018880808080808080048081808080a080028080c08004808080808080908008808010808080888080808010008110008080808080808010808080808080802080808080802080800180808080888080088080888090808010008080908020004080808080808001808080010000808080808080800280018040008082808080080088808080108080a08080808020a08480808080808040808080808080208080804080808080808004008020808080808480801080400080e4808084800200a080088081848080800801008080808080e01f000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080800800000000000000000000808080088080808080808084100080808080803000808080808088808010808480a04080c0808080108080080080808080808080800480808004808080808080108080808080a0800190808080040080828080808080800180c08080808004808080808084808004808080a08008800480808080a0808080010080808080048080808080808040808080908080408081408080808080808010008080801000808020800400000000008080808080808004000080808080801080808001008080808080908080100080808080010100008080808080800484808080809080208080020080818080800280808080808090802080808080809080208080808001808080808080808040808080808180800400848002800282a080808080808004a08084808080800880808880a0808184408080818080808080100080808080808080fe01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808006000000000000000000000000000080808080800200000000000000000000000000808080a0808080801080808002808480808080028080818080908080018080800880908082801080808080808020808080a080048020808080808810808084c0808010808080888080028086048440808084c080808080028080808080808040000000808080808010008080808080808080018080808080108084c080a0808020808080808080800280804000008080200080808080808004808080848080808008808080808080408080408080808180828080408080801080808080c080800180018080808080808010808008808080808010808480808080808020808080808002808080808040008480808080208008000000008080808002808080800280808080808080088080808080808020808080a0808080808001808080a08080808002808080c080801080808080808880802080018180800480800280808080828080088080808080808080029c80808001808080200080fc01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080100000000000000000000000000000000000000000000000000090c04080010080808080808080c08001808088a08080022000808080808080200080808080808081800280808080a08001808080808010008080c08008808080808082808001808080808080800280808080808090800280808080811080808080a08084800100808080808080801080808080808080048080800180804480088080088080808280808080088080808080808070008080808080808080048080808002808080888010000000808080828080801000808080a0804000808082800480808010808080a08080809040804080808280848008808080802080808080808084800880908080c0804080800180088080802080819080028080808080804080808080808001808080818082808002808080808084800880808080800880808080808080808001808080808180808004808480088080808004008010808080808080808020808080800800808080808280803880808090808080801080808082080080808080f8070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808008000000000000808080808002808080800880808080800100808080808001008080808080808080108080808408000000000000000000000000000000000080808001000000000000000000808040000000000400000000808080800400000000000000008080400000808080808080020000808080c0ff070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000801080818080400080808180808010000000808082808080010000200000008080808004000000000000000000808080808080808001000000808008000080808080808080108080080080808080808080808001808080800180808080a0808080400080400080808080100000c080808080018080808080010000000000000000000080800100808080200000008080fc1f00000000000000000000000000000000000000000000000000000000", + "02146ca80ee04179ff609b07f9bbc65c6e47f20d09ca": "0a3173656976616c636f6e7331646a357161637a7030386c6b707863386c78617576687277676c6571367a773275676363786a10e0cb061ab90d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080801000000000008080800400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "02146e900c94f99b249cd8fb6538969e0d9e099c2f52": "0a3173656976616c636f6e733164366771653938656e766a66656b386d76357566643873646e6379656374366a666e6465657010e0cb061ae81100002000000000000000000080800400000080808402000000000000000000000000000000000400000000000080808004000000008080808002000000000000808004000000000000000000808080400000000000000000000000000000000000000000808080400000000000000000000000000000000000000000008080808004000080808020808080100000000000804000000000000000000000000000008080808080808080800100000000000000000000008080fc0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080040000000000000000000000000000000000000000000000000000000000000000008001000000000000000000000000000000000000000000000000000000000000008080808020000000000000000000000000000000000020000000000000000000000000808080808080400080808080888080f8070000000000000000000000000080808010000000808020010000000000000080808080808080800100000000000000000000008080808080100080808080808080800800000080800800000000000000000000000000000000000000000000000000808080800200000000000000000000000000008020000000000000000000808020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808680c2ff010000000000808080808080800100008010000000000000000080902000000080808080808080080000000000000000000080808080080000000000000000808080808080808080018080801080808080808080400000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000080808004000000000000000000008080808080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008001000000808080800100008080808080100080f00f0000008008000000000000000000000000000000000000000000000000000000000000000000000000000000008080040000000000000000000000000000000000000000000000000000000000000000000000008080808080804000000000000000000000000000000080808080808004000000800200000000000000000000000000000000000000040000f01f00000000008080100000000000000000000000000000000000000000000000000080808080808001000000000000000000000000000080808080801000000000000000000000000000000000000000000000000000000000000000000000000080808080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080400080808020000000000080808080c08080c07f00000000000000000000000000000000808080808080808080010080808004000080020000000000100000000000000000000000000000000000000000008080800800002000000000000000000000000000000000808080808080400000000088808080820800000000000000000000000000000000000000000000000000000000000080808080808004000080100000020000808080808080804000008080808080801000000000000080802000000000000000000010000000000000008088808080808080040000000000c02000000000000280808088908080fc1f0000020000000080808040000000000000000000000000008080802080808080808020000000000080020000000000000000000000000000000000000000000000000000000080808080808080804000008080808002000000000000000000020000008080808080808080100000000000000000808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808010000000000080020000000000808080808080808001000000000082808080808080c00100000000008080808080808080018080fc010000008010000000008001000000000000000000000000000000000000000080808008000000808080800400000000000000008080808080800400000000000000000080804000000002000000000000000000000000000000000000000000000080808080400000000000000000000080808080808080801000000000000000000000000000000000000008000000808080808008008080808080808004000000000000000000000000000000000000000000000000000000000000000000000000000080808080e07f0000000000000000000000000000000000000000000000000000000000000000000000000000008080808080800400000000009080808080800480808080808080800400000000000000000000000000000000000000000000000000808080808080010000000000000000000080808080020000000000000000000000000000008080802000000000000080808080808080010000000000000000000000000000000000000000000000000000000000008080808080800800000000000000000000808080808080808001008080808c80800100000000808080808380c0ff038020000000000000000000000000000000801000808080800800000000808080800100000000000000000000000000000000808080808080800800000000000000000000000000000000000000000000000000008080200000808080808080800800000000000000808001000000000000808080808080800800008080800880808001000080808080808080808001000000000000808080108080800400000000000000808080808080800400808080808010000000000000000000808080808080800100000080808080080000808080808080808002008080804000000080400000008080200000000000000000000080808080088080801c80808080800100000000808080808080e001c03f00000000000000000000000000", + "02147482d68a8c68fd7204273223d90864207b1558b5": "0a3173656976616c636f6e7331776a7064647a35766472376879707038786733616a7a727979706133326b393430397134637310e0cb061a91118080808080808080040000000000000000000000000000000000000000000080808080200080808004000000000000000000000000000000008080808080808080040000000000000000000000000000000000000000000000000000008080808080a0800280809090010000000000000000000000000000804000000000000000000002000080808080808040008080808080808080800100000000808080808080018080808004000000000080808280808020801000000000000000000000000000008080808080808040000000000080800200008080808080100000000000808080808001000000000000000000808080800400000000000000000000000000000000000080808080808080400000000000000000000000000000000000008080808008000000000000000000000000000000000000008080808080808080040000808080808080800200000000008080808080800200000000000000000000000400008080802000000000000000000000000000000000000000000000000000808080808080808001000000000000800100000000000000000000000000000000000080808080808080800880808080800400000000000080808001000000000000000000000080808080808002000000000000000080808880800200000000000000000000000000000000000000000000000000000000008080400000000000000000000080808080808080080000808080808080800100000000000000000000000000000000000000000000000080808080202000000000000000000000000000000000000000000000000080808010000000000000808082801000000000080000008001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808001000000000000000000000000000000000000000000000000000000800400000000008004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080010000000000000000000000000000000080808080808008000000000000000000000000808080808080808002000000008080800400000000808080808080808008000000000000000000000080808080801000000000000000000080808080808080800200000000808080200000000000008080808080804000000000000000000000000000808080800200808080808010008002000000008002000000808080801000808080804000000081808080808080080000000000000000000000808080808080808008000000000000808060008080010000000000000000000000000000808080200000000000008080808080808080208080808080808020028080808080804000000000000000000000008080808080808080408080808080080000800800000080808080808080802000000000000000000000000000000000000000804080808010808080808284800400000000000000000000000000000000000000000080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080800200000000000000000000000000000000000000000080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000008000000000000000000000080040000008080808080808008000000000000000000000000008080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080800100808002000000000000000000000000000000010080808080010000000000000000000000000008000000000000000000000000000000000000000000000000000000000000008080808080808010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080800800000000000000000080808080808010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080100000000010000000000000000000008080808080808001000000000000000000000000000000000000008080808080808080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080800200000000008001000000000000008080808080802000000000000000000000000000000000000000000000000000000000000000008080808001004000000000000000000080800100000000000000000000000000000000000000000000000000008080808080808010000000008002000000000000008080808080808020000000008080808040000000000000000000000000000000008080808080800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080802000000000000000000000000000000000000000000000000000000000808080808002000080800200000000008080808080808080010000000000000000000000000080808080080000000000000000000000000000000000000000000000000000000000000000008080808080808002000000000000000000000000000000808080808080020080808080808080800200808080808080080000000000000000", + "0214922357bd8e69e6119d0630f7abbbf7c5e3879f2f": "0a3173656976616c636f6e73316a6733343030767764386e707238677878726d3668776c6863683363303865307a79796d6d6810e0cb061a822c8080808080808080040000808080fcff7f000000808080808010000000804080808080828020808080a00180808080809080080080208080808080040100000080800280808080200180808004000080808080808080088080808020800200000000808080801000000000008080808004808080808080808004000000000080808080c0804080a0808010808080808080808001000000808080040000000000000000008080808080808080800180808084808080800180c080808080800800808080808080408080808080800cc08080e0c1a18082049d809cf08190904281a08082808480049180880400008080808080802080218080808080881000008080807080808080208080808080808002808080808080e0010080c0808080808080108020308280802080888002000000808004808080808080800882808080804080808082808c80804481808080c08010808080820280808080c0808880019080808080808080800180848080802080808080808080e0018080808080e08080388080208c808080808001808380800480802e8080c00c808080c0038080c080800780808080808003808080808080e001809080808090808002008080808080480008800c80809e8080800180408080807000848080028080808180808018808080808080808018888080808080808004008e8080828080804080808080a080c0018080a08080808080238080808080808080028080908080808001000080808080806080a08080800280808080801080808084808080800280808090808088800180808080808006808080808088800380808080808090800e8082808080018080078080c08180108080808004808080808380808010808080802080c08080048040800100808080800480800200808080808080fcffff01ffff038080808080808080010000008080800100000000808080804000008080808080808010808080800480808080808080400080600080801000008080808080048080808080808010808080802000008080808080808004008080808080048080808008008080808080808080400080808080080000808280808080800400000000000080808080040000000000008002808080400080808080808080800480808080800100808080808080800200808080808080800100008080808080800480808080808002808080800400000000808080100008008080808001808080808101040000818080200080c0018080080000808080808001808080808001808080808080800c808080808080808070000080800402808080800c808080808004808080808080190000008080808080808002008080080080808080508081808080100181808080100080808008000000800100008080a08020800200000040808080808002008080808080808080800180808004808080808008808080808080c003808080400004008080c0808080808008808080a080040081808080080080808080800180808080808004803c808084010080908080808080800800008080808004008080808080808008000080800a80408080808082800208000000808080808008000080c0fcaf80808080018080888080020000802000000080010000808080c04000008080010080080000008010000000808080808080808001008080808080808080080000800800808040000000808080800880048080808008000080808080808080040080808080808080080080808080800280808080808080010000008080808080010080808080808010000080028080808001008080801080808080808080010080848080808080801080808020000000000000808080808080808002008080808020a080808080800200602080802000000080808040008080808080808010000080c00180808010a080800800808080808001008080808080808038008280808080808080044080808280808020008080809080808080c00180808010e00100008080808080c002008080020080c08080808080802080808280800800888080818080010080800400800180808010008010808018804001008080804080808080a0802080808040008080808080100081808080400000000000808080800280804000008080808070808080801080808040008080808080c0801080808080808080806000808004808080808004000000808080908080801000808080808004000080808080808010000080808080808080802ccc7e0000008080010000000000808080800100818080808080808001808010000080808080808080408080100000000000808080808080a08020000000008020000000800400000000808080802080048080808480808010000000000000808080802080808080020000000000000000808080808080801080022000c0808080408080808080808080048080888020000080838080808004000080800c808080040000008080808080020080808080808080800400808080808080c00180808080808080880c000080808020c4804000000080808018008080808080800100808080808080800380808080808080400080808080808082800400004000808008808081800100808080808080400000808080808080c0030080808080808008808080808080808040000800000080808080800200808080808080408080808080800880808080808002020000808082808080808020040000008080803080808008008080c080808001008080c010000000c08040008080048080803080809080800180808080802080808001000000300000808080808040000000848080808080808020000000808080808010808090c080e00300000080808080808080800800808080808080808210808080808020008080808080808080100000000080808080808080800200008080801000808080048080808080808080100000808080808004808084808080808008000000a020000080800480800800008080808080018080808080100000808080809080400000804000000080808080808880800280808080800100000000000000000000808080808086400080808080848080804000808088c08080800800c0808280808080848001000000808001808080808280828010808080808020808080800280808080828020000080808080808040b00280a088808080808081018080a08080808020808080c080808010808080808080800280868080c00100808080808008a080808001808080b0108080800a80808080c7800100808480408080808080808020818080848080800890816080808080a0801080808080808001808040008080400080808080802080808480c08010009080808088808080188080808004a0808080808020808080808080200080808008808080808880a0408080808020908060808080808003c080018080088081808080808804808080808080808010828080a080808480018280808080e001808080808040808080828080802080808280808080800180808001a08080808080a00180808080804208808080018080808082808040808080a880818080018080809080c040008080808080802080018080808080808080c20181808004c0818080808082a02080808080808080208380808080208086808080804000818080e0809080801080808080f0800200018020008080200088808082808080808001008080808080808080428080808080088080808480808080100080088080808008808080828010808080808080808007828080828080808020008080808080802000808008008404808080808080800484808080808080408080808404008080808080808008008080808080200000804000008080800280c0808080858c8188018084809084a094c04081a0808082840200808082808080808008800200000000000000808080808080048040008080808080808080800100000000008080800400808040000000008080802000000000808080801000804080808080200080048080808080808040808080808880800800808080808080808018808080808080800400808080084080808080808040008080808080808004000018808080808080800100888080800180808080800880808080808008008080808080808080e00180808080908080084090808004000000000000808280808080800880808080010000808080018040808080808080800400008080808080208480808080808008800400000000808180808080400000808080c0832580028080808080808008800480808002000000008280c08080802000808001000000808080808080801000808080800280010400048080400080808080808080801080808080808280801080808080a08080400000828080808080028080808080088080808080020082808080808008000000028080808080808040008080808080040080802000000080808080808080f8018080808020008080800400000000000000000000808080808080800100000000048080100000000000000080801080088080808080808080080800000000000000008080808080808080800100000080808080808080800280020080818080808080088080808080808040000000000000008080808080808080040000008080800280800180404080808080808080800100808001808080808004000080c08180808080080080808080040080828080808080408080808040000080908080802080808080a880e0018080808080800800908480808080808008000000000000808080808080800200000000000080808080010040808040000080908080804080808080818080040000808080108080068080808080808080018080808080808080800180800200808090808080808001000000000000000000808080808080808008009080808080804000818080808080408010808080800180808080800800808080800200808080808001000000808180808080c080200000000008808080808080808001008002000000008080808080803000000000000000000000000000008080040000000080808080801000000080808080808080100000808080808080808080010000008080808080808080800100000000008080800800001000000000000000000000008080808080020000000000808080808080800400080000008080802080808080800400000080808080808080800202000000008080040000808080808008808080808080808001008080808080805080808080c08080c00180040080e0c77080808080fc3f808080808080807f008080048080c09cf00f80808180809ff801008f90848080808080048080fc9908808080808084f00f808080808080c08740f80180c0c08380e001808080a0808080e01f08808e0f808080f0af823c8080808080808090f0018188808080801080f083808080808008808080808280f00f8080808080808080c001ff878080800280e29c01808080e0f10f808080808080803d100680808080800e80808080c00f00108080c0078080808080fe87a00f80808080808080c0ff01879e8008848080f88098fe3f8090808080808082f4010780e58f8010808080c0ffcfc00f808080808080209f9280800180a0bc2080808080f861808080808080c0c72f718086c00380808080811e80808080808080800480ff03808880838080108080c0ff40a188808080c0c00180808080808080b9c00183bf8080808020c0df03808080809ee0038080808080888e0180808080808080fa04808080a008fd9f8080808080018080c0ff20808280808002808080808080fe1808f0018086808080802080a0fc0380808080f07f808180808080e00f84808080808080800c9f808080808080808001c1ffbc8080801080808080f48104808080808080c0c70200fe0190808080e0ff8721808080808080807880808080808080840f70808080f083e0f101c0804488808080f007808080808080c0ff0130ff1700808080808080800100f8010004000000808080808080040000000000000000000000808080a080808080108080800200008080808080800800000000020000000080808080808004000000000000000000000000000080808080800280809080800300000000808080808080808080010080808180808008000000808080808080800c0090808080808080808001000000000080804080808080c080040080808080808010000000000000008180808040000080808080808080800180808001000080808001008080808080808004000000000000008080040080800c000000008080808080808008008080808080808004000006020000808080808020808008008080808080808007000300808080800190808080802080808080808020800200000080808010808080808020008080801000008080808080020000808002808080100080010000008080808081808020808080200000f09080808080200000000080804080808004000080801000808080200000000000000000008080800800808002808080808080200000000000000000808080800100c080808080808004000000808080808002000000008080a08080808020808080808080808002008080800280200080808080808080400000000000008080808080808080040008008080808004808084808004808040a08080808080800800808080808080808002008080908080808040828080808080800880808008808080828080808008888080808080801000000020800280808080808080048080c08080808008808080c08080808008808080108004000080808080828080208080809080028080808080800400808080808080c001a0808080c0808880408080808080808010808080108084808080808060a0808050808080200000a0808008808080800880808080807080808080c0801080808080808080c0018080808080808080c001808080808010c003e0808010908080808080089c808080808080010280308080800700808080400080818080200000008080820180b880f87f0080808180808004808080049080808080800800000000008080808080808080800100800880808080808020000001808080808080808040000000008180808080800180808084808080804000000080808080808080801000000000000080808080800200808080808080800200008080808080808080208080808080020080804000808080808040808010000000008080888080408080808080808080080000000080808010000080808080808080801000808001008180808080800800008080c08080420080808080800180808080808003008080030080800880808080808080c0032000809280808088808001a08004803000808080808080808008808004808002808080808080800200000080808080808004808080808080801c008080808008000080023000808008802000000080808038808080801000808080808080c00300808080808080802040808080800200080080808004808080800880888080808080400080808080809080028080808080802080808080808084200088808080808020008280c080828001008080808080808002808080808010208080a088018080c080808080808001808080e0018080808080808080c00101c00180800280828008808040808080808008808080c0800180808080808080800180803088808c8080880280808080808020c0808080808080e01000828080808280088080808080808006808080808080800300008080808081808008180000", + "02149f1f7b9b3584198f985adb6aa72037731d2a3c73": "0a3173656976616c636f6e73316e75306868786534737376636c787a366d643432776770687776776a3530726e74796464756810e0cb061ace17808080808080808004000000000000000000000000808080a001808080808010000000010000000080808080200180808004000000808080802000000000000000000000000080808080808080800400000000008080808040000000000080808004000000000000000000008080800400000000c08080a001818880808080108080808080041000000000000000000080808080808080020000804000000000000000008080808080808008008080800281808080808010808080020080808080808080808001000080808080802000808080808080010000808040000080808080808002808080808090208080808080808080020080808080804000000080808080808001000000808080020000000080808002000080808080808080800280801000000080200080808004000080808080800800808080808001000000000080808080248040000000000000808002000000000000000000808080804000008080808080808010008080808080808040008060000000008080808080048080808080808010000000808080808080800400000000000080808080080000808080808080800400000000000000000000000000000000000000808080808080800200000000000080808080040000000080808010000000000000000081808020000080800800000000000000000000000080808080808001808008000000000000008001818080808080808001000000000000000000808020000000000080802000008080800400000000000080808080808080800880808080800400000000000000000000008080808004000000000000808088808080020800000000000080808880808080800180808080800200008020000000000000808080c04000000000800800000000000000808080808080808001000000008008000000000000000000000000000080808080800200000000000000000000808080800100000000800480808020000000000000000080808080200000000000000000000000000000808080100000808080808001000000828080808080808004000000808080100000000080808080808002008080020000808002008880800100808004000000000000000100008080808080802080808040000000000000000000000000000080808080100000000000808004808080808004000000000000000000000000000000000000000000000000808080808080808001808010000000000000000000808080808080200000000000000000800400000000808080802080040000000000000080808080208080808002000000000000000080808080808080100020000080808080808080800400000080010000000000000000808080808080800280808080808080800400008080808080808008000000400000000000808080808004808080200080808080808080400080808080808002008001400000808081800100000000808080808080800100000000008280808080808004808080100090808080800200808080808080400000008080800100000000000000808080080080804000000000008080400000000000808080010000001000008080808080400000008080808080808080200080808008008080808080100080808080808008000080808080808180800800008080808080208080808080808010000080808080800200008080808080808080020080800480808010000080808080808080801000008080808080040080808080808001000000000080800480800800008080808080018080808080108080808080808080010080808080908040000080c0808080808080020000008080808080088080808080010000008080802000000000000080808080808040000000808080808080800800c0800200000080800180808080828080801080808080802080808080020080808001808080808010008002808088808080808080018080808080808020808080808080801080808080808080028086808040808080808080800180808080808001808080800180808080108080800a808080814000808480408080808080808020808080808080800810808080802080808080808040000080804000008080848040008080808080808080100080808080808020000000000080806000c08001808088800280010080808020000080808082808080208080028080800100808080808002000080808080808080408080802000000000808080808080808002008080808080808020000280808080808040008080808080100000000000000080808080808080808001000000808080808080808010000080808080888001808080828010000000000080800800040080808080808080408080800400000080808080808010000000000080808002008080808080a080c04080a08080808402808080808020000000000000000000808080808080040000000000000000000000000000000000000000000000000000000000008080808010008080808880808080010000000000000000000000000000808080808080800800000000000000008082808080808008000000000000000000000000000000000000808080c0030000008080800200000000000000000000000000000000000000008080808080808080100000000200000000000000000000000000000000000000000000000000000000000080808080808080010000000004808010000000000000000080080008000000000000000080808080808080808001000000008002008001000000000000000080808080808080800400000000808001804000000000000000808080808080800800808080800400808080808080804000000080108080808020000010000000000000000000000000000000400000008010000080808010000000808080c0ff808080800100000000000000000000000000000000818080808080400080808080010000000000000000808080808080808020000000000880808080808080800100800200000000000000000000000000000000000000808004000000000000000080808080808080100000000000000000808001000000000000100000000000000000000000808080808002000000000080808080808080040008000000000000000080808080808080800200000000000000000000000000000000000000000000008080808080808080040000000000000000000000000000808080808002000000000000000000000000000000008001000000000000000000000000000000000000000080808080080000800200080080808080808020000080010000400000000000000000000000000000000000000000000000000000000000000000000000808080a080808080108080800200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080400000000000000000000080808080400000000000000000000000000000000000000000000000000000000000000000008080080000000000001000000000000000008080801000000000000000000000000000000000808080808080200000000000000000808010000000000000000000000000000000000000000000000080808080010000000000000000000000000080808002000000000000000000000000000000002000000000008080800800808080808080801000000000000000000000000000000000000000000080808050808080200000000000000000000000808080808080080000000000000000000000808080010000000000000000000000000080808080808020000001000000000000000000000000000080808080808080808001808080808020008080808080020000000080808080808080802080808080800200808040000000000000000000000000008080801000000000000000000080808080800200008020000000808008002000000000000080800400000000808001000000808080800800000000000000000000000000000080808080808080200080808080808080028080808001000000808080800880080000000000080080804000808080808080800200008080a0800100000000000080020080808008008080808080808080010008008080808080808080100080808080828008000000008080808080808008000000", + "0214a633a4eeb521dd9f09326bf5c945bc24327c6a66": "0a3173656976616c636f6e733135636536666d343479387765377a666a643036756a3364757973653863366e78666d3330753310e0cb061adb1900000000000000000000000080808080808020808080a001808080808090800800808008808080808004018080808080808007000080800200018080800400008080808080808008808080802000008002000000000000000000808080808080808004000080808080808080100000808080804000000000000000000000000000000000808080048040000000c08080e084a8848244958094d08180800280808080808480409080800400008080808080802080c08080808080048080808080808080300000808080018080808008008080800800804000000080808080808080010000000000028080800281808080808010808080020080808080808080908001800400808080808020000000808020000080804080808080808002008010008080808080400000000000000084808002808080010000008080808080808040000080808080808080800200000000802080808080801000000000008080808080010000000000808080800480400000808080800400000080048080808080808080010000000000000000000000808080808080801000000000000000008080808080048080808080808010000000808080808080800400000000000000000080808080808080040000000400008080808004000000000000000000808080808080808004000080808080808080020000000000808080808080028080808004000000000000000000008480018080804000808080200000808008000000000000000000000000808080808080018080080000000000000000808080010000808080080000008001000080802080020000000000008080808080808080800180808004000080100000000080808080800400000000000080808001008080808080808080080000000000000080800200000800000000000080808080808080800180809080800200008020000000000000808080c04080808080808080802000000000000000000000008080808080808080010080808080808080800800008008008080c08020000000008004000000000000008080808080028080808080808001000000808080800400000000008080808001008080801080808080808080010000808080200000000000000000808080802020008080808080808080800100000000000000000001008080801000008080808080010000000200000080808010000000008080808080800200808082801000008080020088808001000000000000000000010000808080808080200000000080808080400000000000000000000080808080100000808080808080801000008080040000808080200000000000808080808008808080808080108080808080080000000000000000000000008080808001008080808080808080018080100000000000000000000000000000802000000000000000000000808080848080801000000000000000808080800200000000000000008080808080808010000000008080808080808080040000000000000000000000008083808080808002808080808080808004000000000080808020c080808080200000000000000000808080808080804000808080808080020000000000808001000000008080808080808001000000000080808080808080040000000000000000000000000000000000000000000000008080400000000000000000001000008080808080400000008080808080808080200080808008008080808080108080804080808080808008000080808080808080800800000080800480808080808080801000000000808080808080808002000080808010008080800480808080808080801000000000000000000000808004808008000080808080800180808080801080808080808080800100808080808080400000804080808080200000808080808008008080808080808080200000808080200000000000008080808080804000808080100080800800c0808280808080048080800100008080018080808082808280100080808080028080808080808038808080018080c081801000800280808880808080808101808080808080802000808080808080800280848080c0018080808080c08080408080808080888080208080808098800480808080108080800880808080c0800100000080808080808080081080808080200000008080400000808080804000108080808080808080080000000080808080080080806000408080088001808080808080808010828080a0808080800102008080800280808080808080800180808001808080808080800180808080804200008080808080808040000000008001808080808080808042808080048080808080808020808080100080808080808040008180808080908080100000010000008080808040808080808080808080010880808080808080804280808080800880808080808080100090088080808008808080808010008080808080808080200000008080080084040084808080808080408080808484808080080080808080808080088080208080808080801000008040000080808002808080908081888188018084808084a0948040818180808080020000000000000000000080808080808004000080808080808080808001000000000000008080400000000000000000000000804000000000000000808080801000808080888080808001000080808080808080800800008001000000000000008080808080808080208080808080808008001000000000000080808080808080080000000000008080808080020000000000000000000000808080c01b00000000000000000000000000000000000000000000000080808080808080801000000082808080808002000000000000000000000000000000000000000000000000000000000000808080808080800100000000048080100000000000000080801000000800000000000000000000000000800200808180808080800880808080808080400000000000000000000000008080018040e001000000000000808080808080800800008080808080108080808080808008000000801080808080200000100000000000000000000000000000004080804000008010000000000080808080808080800180808080808080808001008080408080808080808080010000000000000000000000000081808080808040008080808001000000000000000080808080808080802000000000080000800200000000000000808080808080800c000000000000000000000000000000000000000000000000000000000080800100000080808008000010000000000000000000000080808080800200000000008080808080808004000800000000000000008080a0808080808002000000000000000080808080800800000000800400000000000000000080808080808080800480808080080000000080808020000000000000000080808080800200000000000000000000000000048010008001000080808080010000000000000000000000000000000000808080800800000000080080808080808020802000800100004000000000000000000000000000000080808080808080010000000000000080808080808004000000000000000000000080808020808080020000808080808080080000000002000000000000000000000000000000000000808080808040008080808080010000808080808080808040000000000000000000000000000000808040808080808080040080808080808010000000000000008080808040000080808080808080800180808001828080808080108080400000000000000000000000000000000000808080808080800800008080200000020000008084080000000000001000000000000000008080801000000000000000008001000000000000008080808080802000000000008080800c00008080100000000000000000000000808080080000000000000000000000808080800100400000800480808080800280808080808020000000008080010000000000000000000000000000000000000000000000008080800880808002000000000080020000000080040000808080808080802000000000200000008080805080808020000020000080808080400000000000000000000000000000000000808082010000808080808080048080808080808002000000000000000000808080808080200000000000000000010000000000000000000000000080808080808080020000808080808080808020808080808002008080400000808010000000008080088080808080808080080000000000000000000000010000808080808002000000000000000020008090808080080000000080800400000000000000008080808008000000000000000000000000000000808080808080802000008080808001000000000000808080800e0000000800808040000000008080208080808004000000000080020000808080400000808080808080020080808080808080801400000000008080808080802000000000", + "0214aa5241dbd04ed2d969216d30c14d408ce3356919": "0a3173656976616c636f6e733134666679726b3773666d66646a366670643563767a6e3271336e336e3236676568727134793410e0cb061aea268080808080808080800180808080800100008080808080808010808080808080804000808080c00280a2040008808080a0808080800880808080808080022000808080800100008480808080800100000080840200000080808080804000fc3f0080808080808080f0ff010300808080800100808080808080802000000000008080801080808080c00780808080808080088080808080800100808080808040000000802000908080088080108080808080400080808080200000080000000000000080808080808080801000808080808080808808008080808080808080108080808080808080408084808080808040808080808080018080808080808080040000000004000080800100808008000000000001000000000000000000000080808080808080801080808080808080040080808080808010008080808020808080808080808001008080808080c001008080808008808080808002808080808080801080808080801c808080808080808001808080808781028080988080808080408084408090808080808080c001ff01008080808080a0808001808080808080408080808010000080908080801000808080809010008082800880808080048180808080c080108080808020008280808080808088800100a28081802080908080808080808001808080808004898680808080048080808002000080808080808080028080808080808080c001ff010080808080808081030280808080808280048080808080028080808080c0c080020080808001818080808890028080a0c080a48001c4808080c0808041808080808180802080808080048080a0808002808004288080808080808001000080808088808080800c83808080808080ffff01ff97808080e402808080808088088080808002808080a08080c40980808004808004808001100080808004808890808080c08008808080808080800108808080808020808080808080048080c0810280808082808010808090088080808080408080808080808080100080808080808080108080828080808480018088208080808080800480808080800680809480808180400080808084808002808080808080010100008080808010808180808080100080e0ff8380a0208080808080810180808080804280808080904080800880808080800880848080848080408080808080808080200080808008008010802080a08080088180808080408080808001808080808080400080808080c080488080808020808080808010808080808484200080b08080808080804000008080128080208008808080808080808810808080808080804080808080808004808080a08080808020008080808080d002808080808080808080018e80808080088080018080808002000080818080808080f07f808002808080800180848080820400000000808080808080800100808080808080018080808088808080800140808080808085808020808080808180801080800800008080808080808010000080c08080818080804080808080808080f0ff0187fcc0c882bd80c860c280909280a0a03980c085c04280808080808080408080808080010000808080800208808080808080800282808080808080807e8080808040808080808080808001808080800400828080808080c0308080808080100000808080808080802000808080808080808080018080800200008080208080888080802000808080808080a0a88101040080808080804000000080808080808080100000000000800480804000000080808080100080808080902080808080800100808080809002008080808080808040808080908080198080808080808006b0d39c802000000000808080800180040084518080808080c0ff030000000080b48188818028808080800280e0ff138080808080848081208080808080808010000080808080808080811080808080808080048080808080808180020280412080808080801080800c800480108080808080808080fc010f88c7830c0000808080808080808040000080808080800100008080808080801080808080808080280000808080808080808049858080808080100000000080808040008080808080808080104000000000008080808080408080a080808080208080808080ff07808020808001000080808002000000808010000080800580808080808080800400808080808080020000008080808080808080010000000080028080e08080808080080080404880808088488080801080818182808080800101808080808010808080808080018080808080c080800400808080808080808001008080808080801c808080818080808004808080804080a0808080802080808080808080800c8c80808080808002018080808080840200008080808080808080028008008080808080ff1f00000080b0808080908080408080808280808080030000000000008080808008008080808380808040008080808080808080080000008080808040800880800800808080808080807000000080808080802080c001000082e080808080802080808080b0a020808080800100000000008080808080c0ff03000080958007808080808080200000808080808020808004808080808004008080808080200000800440008080808080808080200000000000000080808080908080040080808088828080040002008080ff030000000080808080108080808080f0ff010000000000808080808010808080800200000000808080808020808080088080808040000000000000808080040080848080808020808080808084808080018080800400008080808080808080e001ff018080808011808080808080400000808080808080808080010000000000000000000000808080808040808080010000008080808080808080010080808080c0816080800800000000808038008080808002000000008080808080808040000080808080808080208080fcbf8008000000008080808080800100802080808080801000000000000000808080fe1f00000000000000008080804000000000808080808081808001008080a08080808080fc010f0080808080808080800880808080200000010000808080802000000000000080808080828080018080808008000000000000000080808080808080800180808080400080808080800880010000048080808080802080808080a00480a0c0f2808080c0ff0103008080808008808080808080804080808080808001802000000000000000000000808080040080808080808001000000000000000000000080808080808080801080808080808080a61000000000000000008080040000000080848080808048808080808080208084808080800280808491808040008080808480808008a08080808041808080c08780208080809080800880808080fc3f00808080020000808080808080928044000000080000808080808010008080808080800480808002000000000000000000000000008080808080800200008080c080808002808080808080c007028080808080188084808080800400848080100080808080100080808001048080a08080808001008080808080c080010080808080808001808080808080808020008080808080808020808040000000380000000080808080800200000000808088808080808080018080808080080000008080808080080080800a000080808080808080200000008080808080800400808080808040000000f0ff0100000080808002000000f0ff01808080800300808080801080888081048480808080808080ff018f80088080808090808080208080808080400000000000808080808080c08001808080808004000000000000000080848080808080080000008080808001008080808080808080080000000000000000080000800100000080808080080000000000000000000000000000008080808080802000000000000000808080808080800c000000000000000080808010000004000080010200000000008180c080808080804000000004000000000000000080808080808010008080808004808080ff8780800100000000108080808005000000000000000000000080a0200000008080800800000000000000000000010000000000808080808080c08004008080400000000000000000000000800800010000000080808080808008000000000000000000000000000000808003808080808080a02000000080808080808080802000008080808080808020808080808080808080010080808080e0ff03000000000000808080808080800200000080808080200000008080808080218080808080808080048280808080200000000000000000000000800200008080802000008080808080048020808080808080808010008280108080808008808088808010808080801080080000008080808080c0c0ff0700008020000200000080808080808080200080808480808080800280808080808080010080848080808080843100000000000080808080808080800a00000080808080808080048080808090400000804080808008000080808080808080108180808028c08080805120008080808020808080808088a0028081808022808162000000000000000000808080808080808001808080808080200000008080808004809080808080c08012808010000080808080808080040080808080808080920a8080808008000400008080818080804000808401000000000090808080808080fe1f408080808080808004fe8f8006008080801084c0c0280000000080a080c010808080808080028080a08001000000a0808001000000000000000004008480808080802880808092808080801080808080802000000000000000808080804000000000808208000000808080040000000080808080802080808080808080801080808080804080808080848080801020000000000080804000000000000000808080808180108080848080100080808080808001008080030080908080808010000000000000000000808020000000008080808080408080808080808080010080808180c0a0be800884948080c08080a0048080c0b88080d8850886808080080080a080808080f0ffff010100000000000000000000080080808080408080808090809080028080808080808050008080808080808080040080e0820180040000808080808080808001008020800100808088808080c00180808080808001008080808080888080c001ff03808080f03f0080808080018080888080808084048080808020808020020000008080808080802000000000008080808002000000008080808080680000000000008080c002008080808008000000008080808010000000000000808080018080f83f000000008080208080800400000000808080c00200008080808080fe0f00000000808080808080808020008080808080808080800100000000000080808080808008808080808080808020000000808080808080808008802080808080808008000000808080808004808080808010000080808080808080800800808080800100808880808008000080808080800800000080808080808080108081800400808080808080800800000084808080808002000000000080808080808080c00100808080808080f085108080808080c8a0480005000080808080808080800200000080f03f80048080808080808080800101000000008080801000808880808080a00a808080108080808180808020c0808080808080040000800200000080808080e0ff1f00808080100080808080808080040000808080802000000080020100808080801000000080800200000080808480088040000000c880804000008001888c808080808080080080802000000000008080c009008480808080809082080000800100000000008080808080080000808080908080808040008080808410000080100080808080808080010002000080808090020100008080400000000000008080808080018080808080808004a08080802080808080200000000000000000008080808080808008018080808080080880c0804080801400808080808140008080808080100040808088808080804000008080808080088080808080808080028080808080a00c80808980808080100080808080808080cc028080808080a080800200808080808040008080808080080080808080808080200000000000008080808080808080020080808040000000000080808080802000000080809a802080c08080808080808001000080ffff0700000000000080808001808080808080804000008080808020000080808080a08002000000000000008080808080800180808080801800000080808080808080040080808084802000008080808080800600000080808008008080020080808080808080040080808080808080010000000000000000000000000000000080808080808080f03f0000000080808080808020000000000000008880808080801000000000008080808080801080808080808080208080808080808008000000000000808080828080804000000000008080808080020080828001818080a08080808040008080808080c00100808080808080808040008080808080809004808080808085010080808080808080802080808080808082408081808080801080808080018080a080ae0da0801980804080808080e0058080808080020080800800000000808080808040808008808080808880808020000000000000000000000000000000000000000080808180808081800880808080800484808090806000", + "0214ab873ff0a3f0bd6d36712004c61ce8bf5970eb60": "0a3173656976616c636f6e73313477726e6c753972377a376b36646e3379717a76763838676861766870366d7176357166337010e0cb061aa61e008080808080080080801000828080808020000000000000808080808080010080808010008080804080800880808080808080802000008080808080400000020000818080848020000000808080808080808040000000000080808080808080802004000080808080808002008080808080800200000000000000808080808008000000808080808080810200008084808002000000008080408080040000808080808010808004000000000000000000000000000000000000000080108080808080e0ff0380808080800100808080800200008080808080808080010000000000000000808080808080808040000000000000808001808080808008808084c0808080028080808080200000000080808080808080808001000080808080010000808080808080800280800200000000000000000080808080808080803c80808008000000809f808080808004808080808080808060808080802000801080808080808010000080c08180808080080080808080808080800800000000801000000000008080808080808080400000000000000000008080a080088080808080802000808080800400008080808080800800000280808080808080800800000000000080808080804000000080808080800480048080080000802000000000000080808080800800000000808010808080808080800400000000000000000000000001000008808090800400000000008002008080040008000000000000000000000000008080808080808080800100000000000000808004808080808080a08001988080808080080000008e8090808020000000000800808080808080808020808080808080400000008080808080808080800180808080010080808080808004808080808080808080010080804000808080808080808080010000000000000000008080808080100000000000000000000000808402000080020000000000000000002000000080808080808080040000000000000000000000000000000000808080800400808080808080040000808080808080804080808080040080800100000000000000000000000000808020000000008002808080808080808004808080feffff0f00018080808004008080808004000000008010000000a080808010000000008008000000000000000080808010000000000000000000000000040000808080808080400080fe010000008080808080808004001000000000808080808080808040000080808104008080808080800400808080802080c080028080800800008080200000040080801080808001808080808080800280808080808080802080808080800400808080808080800400808080808010000000008080808080801000000000000000808080800400000000000000808480808080802800808001008080808080808080800100000000808080808040808080808080808008000000000080800100000000000000000000000000808040000000008080808080808080100080808080808004000000000000000000000000000080808080808080018080808080d0ffff070000800880808080908080b0c101ffc380e0af8283bc0481a2888080b99602c8c0c0a0848080080000000000000000000000000000000000000000000080808140808080808080408080802080828080808040800800808082100000040090808080808080800180808080808008000080808080808010808080f01f208080808080048080208080c031010000000000008080808081808080010000000080808080808002000000000000000000828080808080800100000000848080808080808020000000000080808080808080800180808080801000008080808080808080010000008080808080400080801000808080080080800800000000000000808002008080088080808080108080808080100000000000000000008040808080808080808080010000000080010000000000000000000000000000000000000000808040000080200000000000a08080808080808001e0ffff3f000000808080808080800400000000008080808001808080808080800400808080a08080800800000000000000000000000000000000100000000000000080808080200080801000808080808080800200008080808080c0ff0780808080200080408080808080808880800180208006100000000000808080908080800100000000000000808080010000000000008080808080802000008080800100000000000080808080804000008080808002008080080000808080800400801080809080808002000080808080800810008080408080808002008080808080808010808080808080809010808080100080400008000000000080800100008080100080808001008080808080020080808080808010008080808080070000808080808001808080800800000000008080018080808084808080400000008080800800808080010000000080808080808080200000808080808010801080808080800180808080808080880180808080808080f0ff01ff27008080808080808004008080802000008080808080808080088080808008000080808090080000000000000000000080808080808080040000000000008080804000000080808080808080040000000000008080808080c080800400008080808080400080808080828080800300808080808080010080808080a080808060000000000080808020000000000000808080808080048080808080808080100080040000000000808080808080808020008080808090a014d08080808080808404000000808002008080808080800180808080808080808001000000000000000000000000000000808080208080808080200000000000808080808080802200008080908080800400000000000000000000008080808080800800008080808080080000008080808080010000000080808080808080800800000000000000008080808080808080088080808080808040000000000000000000808002008080108080808010008080400080c0ffffff03000000000000000000000080804000008080010000808080801100000000000000000000002000808080801000000000000000008010000080feff07000000808080808001b88080808080808040808080808080808005008008000080808080808080010000000000808080808080800200000000000000000080808080808010000000000000000000000000000000000080808004808080808080800280400002008001000080808001008020808080020080808042000080808080708080808080801080802000808080808080800400808080808080c001208080808201088080808080808080800100000800000000008080808080800280803000808080808080808020008204008080808080808080040000808080808010000000008180200080808082800100008080808080808080c001008080808080808018000000808080808001000000808080808080028080808080c0ffff0780808080108080808080804000008080028080808080808040208480808080808040000000008008008080308080040080a08080c080808010000081808080808080208080808080808080048080808080804080808080808080801000808080808081801000808084208080018080808080808080080000808010000000808080808080818010008080808004818080020080048004808080f887803e80808080808080800f008080808080809803808080908080800180808080f02080808080808006808080802000808080c28080800880809040888080808080038080809080804080808080804080809080808020008090808080808080c001002000808090808080800880808080808080048008808080a080800180808080248080808080018080a080808080010080808406808080400080308080802080808002008080802000000080808080800400808080d0040080802081808080808080048080848080808080048080808080060000028080808080808080108080800400800480808080808002808080808080804080808080830100808080800380808080808080018080800200808081808080081000008280808080100000008080808080e0ff9fa001c0d08081800180828080808280c08001a0c080808080808008808080808040808080808080010020000000000000c08080808010000080808010000000808080808080808004000080808080808010000000808080808080800880808080808080080000000000008080808080100000808080c0ffff01040000000000808080808080800280808080010000000000000000000000000000808001808080800400000000000000808001000000808080808010000000000000000000008080808080e07f000080808080808080b003008080808006018080808080804080400000000000808080808020000000000080020000000080808080808010000000000000808080c08080800420000000000000000000000000804080800800008080808080808004808080808080808008000000000080808004002000000000801080800100008080808001808080808080040080808080808080010000000000808080808080048080808080020000808080808080804000000080010000000080808010000000808080804000808080802000808008000080600000800400000000008080808080208080808080fcff070000808010000000000000808080808080808001000000000080808080800480808080808080800a000000000000000000000000000000000000008880808080801000008080808080040000000080808080808080803f008080100000809e8080808004808090040000808080800200000000000000000080808020808880808004808080808080802000000000000000000080808004000000808080800200808010808080804000000000000080888080808080801000000000000000000000808080808004008080808080800100000000000000000080800200000000000000000000008080808080808002000080808080808080c04f800180400000000000000000008080808080808080400000000000008040808080800200000000000000808080808080c0ff070000000000000000000000000080808080808080808001808080808001000000000000000000008080c080808080800200000000808080808080800800000000008002000000000000000080fe0100000000808080808081028010008080808001000000808098c084804080c008808080808080802000000000", + "0214b016593fc42b4a1988404f3d80afef984bd966e2": "0a3173656976616c636f6e73316b7174396a303779396439706e7a7a716675376370746c306e7039616a65687a6e6b6879743910e0cb061aa11a80040000000000000080010000000000000000000000808080808080808008000000c0808080808008000000008080804000000000808080a080808002000000000000000000008080800400800400008080808080800800808080808001000000000000808001008080c08080802002000000808080100000000000000000000000000000000000000000000000008080808080808080800100000000000000808020000000000000008080828082080080808080808080800800008080808081048080808080108082808080808001000080808080808080800400808008008080808020808080808002000280808080808080080000008080808080808060008020000080808080808080802000000080808080800100000000000000000080808080808080200080808008088080848002000080800100000080808080808080800100808080808040000000008080808002000000000000000000000000008080808080010000000000008004000000000100000000000000000000818080808080802000000080808080808020b880808080c18ec00abe808080908080108080808081c00801000080808008000000000000000000000000000000000100808080808280018080808080808080800180808180805080808004808080100080808080808080020000808008000000000080808080808080802000808040808080888080800800000000000080802000008080808080808080800100000000008080808010000000000000808080808080801000000104008080020000000080808080400000000000000000804000008080808020000000000000000000000000800180808080108080808080808020000000000080800100000080808080808080028080808001008080010000000080020000808080808180808008000000000000800100000000000000000000000080808040000000000000800100000000040000000080808080808002000000000000000000000000000000000000000000008080400000000080808080808040000000000200000000008080808080808080108080808080808001000000000000000001008080808080808008000000000080800100000000008080808080808080400000808080808002000080010000000000008080400000000000000080808080808080800480400080808080808080100000000000000090108080808080080000000000808002000000000080808080200080808080800200000000800800000000000000000000000000808080200080808080801000000080808004000000200084808080010080808080808080020008000000000000000080888080808010808080808080808004008080808080a010000000000000000080400000040000000000808090808080018080808080010000000400000000808040808080808080808001800400808080808080808001008080808080808480400080808080808080800200000000000000808080808040000000808080080000000080100000000000000000000080040000808080800400000080800100000000000000008080800400000000000080808080808080400000000000002080808080804080808080808080800800000000000000808080800800008080800800000080808080808080100000000000000000008080808080808002008180808004000000000000800840000000000000008401808080800480808080808010008080808080802000808080808001808080800400808080808080408080800100000000000000000080808080800100008080808002000088808080808022000000000000000040808080801000808040000080808020000000000000000002000000008080808001000080400080808010000000000000100000000000008080808080800100008080808080808010008080808080808080200000000000808008000000000000008080100000008080808080080080808080020080800400808080020000808080808002008080804000808080808004808080808004000000000000000400008080808080040000808001000000000000008080808080808080040080808080808080200080208080048080808020008084801000808080808080802000000000808080804000000000080000000000000000040000808080808080a080018080808080200000808080808080804000c080c080800480800800c08080808080800200808004808080908080800180808080808080800480808080a02080808080088080808004808080c08080800280100080800220808480808080808080010280902080808080808080021080808080884080808080020000000080808080808080802000008080808080808080028010808080808080088080808080048080808080020080808008000280828008808080808080080080808080808020808080808080808004808080808080408080808080808002008880808020008080808280808080800180808080808080800180808080a0808080400000808010808080808080808040008080808010088480809080808080428080808080808080018080808080804000808080804001808080808008000080808010808080808040808084808004008080808080c08080800100000080808080808080048080808080808080800180808080802080808080808080804080808080801080800200808080808080800400008080042080808080800800008080808080808080040080808080808080020080808080808002808080801001008080808082808080100080808004008080828080808020000080808080800280808080808080a02080a0808380a080028080888190d08010c08041000000000000000000008080808180808020000000000000000001808080808080808020000000000008000000000080808080808080200000000000000000800400829080802000000000000000000000000000808080808008808480800280808080808008000000000000008080808002000000808080808080802000008080100080808080808002000000000000000000e080020000000000000000000000000000000000000000808080808080808020000000000000008080400000000000000000000000000000000000000000000000000000000000008080802000000080808080808002808080808080808008000000000000008080808080808080088080808080808004008080808080880400000000000000000080808080802000000080808080808080010080808080808040000000000000000000000000008080808080808040808080808080802000000000000000000000000000000080800400800a008080808080800800000000000000000000000000000080808080808020808080808080808020000000000000000000008080808080a0808001000080808080200000000000000000000000000080808010002000000000000000008080808080080080808080808080800100808080808080040000000000000000000000000000000000008080800200000080808080808080800200000000000000000080808080040000000000000080808080808080400000808080808002000200000000000000000000000000008040000000000000808080808080040000000000000000008080808040000000000000000000000000808080808080800200000000000000000080808080808080800280808080800180028080808080010000000800000000808080040000000000000000000000000000008080808080800880808080808002808080808080800800000000002080808080808008000000000000008080800400000000000000000000808080808080800100808080808080040000808080080080808080808040000080808080808020808080040000008080808080800800000000008080808080800400000000008080802000000000000000000000000000008020000000008880808080848080800100000000000000808080808080010000000000000000000000000000808080808004000000008080100080200000808080808010000000000000000000000000000080808080808080802000808080010000000000000000808080802080100000808080802000000000000000000000000000000000000000008080808002000000008080808080800100000000000000000000808080808080080000000000000000000000008040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080808080808020000080808080808080020080408080800800008080808080808080108080808080808040808080804080808080808080808001000000000000000000000000000000008080808080801000000000000082808080808080808001000000000000000000008080808080808002000000000000008080808080801080100000808080808080100408008080808080801000000080100000000000808080020004000000000000000080808080808080804100008080808080808040008080804000000000008080808080801100808080808080800400808080080000", + "0214b1e0490aac5cd08248c284378296d86810410591": "0a3173656976616c636f6e73316b3873796a7a3476746e6767796a787a73736d6339396b63647167797a70763376633539707010e0cb061a9010000000000080808080f8ff3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080a0848425b3abcec0878890068080899882c480a08e018081800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0ff01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080803e8040000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080800400000000000000000000000000000000008080808080808002000000000080808081808002000000000000000000000000000000000000000000000000ff0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808020000000c0010000000080801000808080040080808040008080808004000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000808040000000000000000000008080801000000000808080808080fcff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808004000000000000008080808080100000000000000000000000808082020000808080400000000000000000000000000000000000000000000000000000000000808080020000000000000000000000000000000000000000000000000000000000000000000000000000008080808080e0ffffff0100000000000000000000000000000000008080808080eeffffff01ffffffffffffffffff01ffffffffffffffffff01ffffffffffffffb30ca080818e81888080c001908080802080028080988080808010808080808280808080010080908480808030808080808080808008808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080e00700000000000000000000000000000000008080808004000000000000000000000000000000000000808080808084020000000000000000000000000000000000000000000000000000000000000000000000808080808080808080018080808080808080200080800800000000000000808080800800808080808080100080808080808080801000000000000000000080808080804000000000000000000000000000000000000000000000000000000080801000000000000000000000000000000080808080808080f807000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080200000000000000000000000008080808080800400000000000000008080080000000000000000000000000000808080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080808080400000008080808080808080c0011f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000808080010000808080808080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080fc030000000000808080040000000000000000000000000000000000000000008080808080808080400000000000000000000000000000000000000000000000000000000000000000000000000000000080808080802000000000000000808080808080100000000000000000000000000000808080808080100080808080808080800800000000000000000000000000000000000000000000000000000000808080808080feff0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080020000008080808020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808004000000000000000080808040000000000000000000000000000000", + "0214ba479c5c63d95550191e3d6434ba557bd5f69508": "0a3173656976616c636f6e733168667265636872726d3932347178673738346a7266776a343030326c6439676767616d61686410e0cb061aa70e00000000000000000000000000000000000000000000000080808080ff0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080180000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000080e0ff0f000000000010000000000000800200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808008000000000000000000000000000000000000000000000000000080808080808080100000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080fc011f0000808080808080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000080808080808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080f87f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080800800000000000000000000000000000000000000000000000000000000000080808080808080800100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080804000808080f80f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080c0ff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080f07f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080802000000000000000000000000000000000000000000000008080808080ffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080040000000000000000000000000000000000000000000000008080808080808080010000000000808080808080800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800200808080808080e0ff1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0ff0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808008000000000000000000000000000000000000000000e0ff0f00000000000080808080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000000000000000000000000000000000000000000000000000800800000000000000000000000000000000", + "0214cc60893a39b4e2db10ec336489c71f2b537a7c65": "0a3173656976616c636f6e7331653373676a7733656b6e33646b79387678646a676e33636c39646668356c7239637a3770756a10e0cb061ac60e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808020000000000000000000800800000000008080808080808020000000000000000000000000000000008080808080e0ffff07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc80a080208080800c80040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800200000080c00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800100808080808080808008000000000000000000000000000000000000000000000000008080080000000000000000000000000000000000000000000000000000000000000000000000808080808080e07f00000000000080808080808080200000000000000000000000000000000000000000008080808080808001000000808080808080808020000000000000000000000000000000000000000080808040000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080804000000000000000000000808080400000000000000000000000000000808080808080801000000000000000000020000000000000000080808080808080802000000000000000008080808080f07f000000000000000000000000000000000000008040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080e0ff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080808080010000000000808080808004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808084ff0780808080808080d001808001000000000080808080808080f8ff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000808080804000000000000000008080808080010000000000000000000000000000000000000000000000000080e0ff1f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0214cc7dc427a5ee1fea25236dbd78ab8f66db0aec22": "0a3173656976616c636f6e733165333775676661396163303735666672646b376833327530766d6473346d707a6d337977303310e0cb061aa70e00000000000000000000000000000000000080808080808080fcff01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080f0ffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080fc0107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080fe0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800200000000000000808080e07f0080808010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080c0ff0300008080808038000000000000000000000000000000000000000000000000808080040080804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080803000000000000000000000000000000000000000000000000000000000000000808080f00100000004000000000000000000000080808020000000000000000000000000000000000000000000000000000000000000008080808080808007000000000000000000000000000080100000000000000000000000000000000000000000000000000080808080808080800f0000000000000000000000000006000000000080808080c0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080f01f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080800c0000000000000000000000000080808080808010000000000000000000000000000000000080808080f807000000000000000000000000000000000000808080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080c0010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080807e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080fc7f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080c00100801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0214ccc61d60e3dd1121bbbb2ea4c0039f91fd372389": "0a3173656976616c636f6e7331656e7270366338726d35676a7277616d39366a767171756c6a38376e7767756634386a736d7510e0cb061ace160000800200008080808080808080e00100000000008040000080802080808080010080808080800400000000000080808080808080fc7f000000000080808003000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080802000000000000000000000000000000000000000000000000000000000000000000000000000000000008080809c8280028080808080802080f03f8080e08480808004808080807880808080800480808080800d80808080800680808080808080020080808080068080804080808080400000008080808080808004000000804000800300008080010000008080808080808080010080808080808080802000808080808080808008808080808080808006808004808002100080808004010000000000000000000000801800008080400080808080800e808080808080088080808080808010000000000000000080feff3f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080800800000000000000000000000000000080808080200000000000000000000000008080808080408080808001008080808080880180808080808080060080808080808080801800000000000080808080808080800100801f80808081200080808080808080180000000000000000808080e0010000000000000000008080808002000000008080808080800100008080808080808080020000008082808080808080300000000000000000808080848080808040808080808080808080010000808080600080080000000000fe1f008001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080040000000000000000000000000000000080801000000000000000000000008080808080808080780008000000800400808080040000000000000000000080808080808080804000000000808080808040000000000000000080300000000000000000000000000000000000000008000000000000000080808080800480808080800800000080808080808080f07f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800480a00400808080828004808080108080802000000080888080300000888080808002808008008080808018808080c0804000008080808080808082408080808080808002000000000000000000008040801018824000804000808080038080808008808080808040000000808080200080808080800880808080800100000000008080808020008080808080808008808080808080808010808080808080408080801000008080808010008080800200808080100000000080e0ffff070000000000000000000000000000000000000000000000000000000000000000000000000000000000008001000000000000808080800200808080020080808080808040000000000080808080808040000000000000000000000000000000000000000000000000000000008080c03f808080fc0180808080807c8080100000808008000080808080868080200000808080808080800680020000000000000000008080800880010080808080808020808001808002000000818080040200808080808080040000028080808080808080c0010180020080808060808080088080808080108080808080803c00000000008080808086808004000000008080808080808080200000000000000080ff1f0080800f0000000000000000000000000000000000000000000000808040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080808080208080808080808080c001808080808080c00100180000000000008080400080a080808080804000000000008080808080808080140000000000808080800c800100800100000000800200000000000000808080800400000000808080808080c0010080808008000000000000000080808080808002808080808080048080808080800880804000004000008080fc0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000008080808080808080040082820280980600000080808080808001808080802080808080800880808080808080800280808080808040000000a080808080808002000000000000008080808080800600008080808008000000008080808080808004000000808010000080808080808080808001030000000000000000000000000000000000000000008080808080804000000000008080808080808080fc0100000000000000000000000000000000000000000000000000000000008080808080801e808080808080808008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000803e803800000080808040008080848070008080808080018080808080188080808080c003008080808080804080808080808070808080808080808008808080808008000000000080010000008080808001000000000000808080808080010000808080800100000000808080808001000000000000000000000000000000808080808080808004000000000000000080808080808080c01f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080808080040000000000000000000000000000000000000000000000008080800c808010808080e0ff010080808080808080f003808080808080808080017f000080f007008080800980808060808080801e022080803e808070008080080000000080808001808080c0010000808080808008000000000080808080808080802000000000000000000080808080808080088080808080808080e00100000000000000000080801e0000808080040000000000000080808080080000008080808080808080fc01030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080800810fc80808080808080080000008080c00100808080808080010000040080818080808080801080020080808080808080803000808080100000008080800800808080808080028010000080808080088080808002808080808018808080808080800180808080808080800600848080808080908003808080080080808010008080808080808002000000808080808080040000808080801e808080808080088080e011000000808080808008000080060080808080804000808030000000808080808080800c00008080808080808038000000000080ffff1f000000000000000000000080808080806000000000000000000000000000000000000000000000000000000000000000000000000000008010000000000000000000000000000000000000000000000000000000000000000080808080800480808080808003808080808080060080808088800480808080800100808080801800808080808060808080808080808020008080808080808004000180808080808020008060000008000080808280808020008080800280808080808080808001008080804080808080800880800600804000000080808080808040808080808004000000000000", + "0214e1ca4bceb36e12283ccab4a844a97e0c050f005a": "0a3173656976616c636f6e733175383979686e346e6463667a733078326b6a35796632743770737a7337717a36396c7765726e10e0cb061a98148080808080808080040000000000000000000000008080802000000000000000008080020000808080040000000000000000000000000000000000000080808080808080100000008080808008000000008080800400000000000000000400808080048040000000808080e091a0808204948894f081b0904280a080808084800480808004000000000000000000000000804000000000000000000002808080020180801000808080808280801000000000808080808080010000808080c00180100000808080feff0100000000000000000000808080020000000080808080808080400000000000000000000080808010008080808080080000000000000080808080040000000000000080800280808080808080800100000000000000000000000000000080200000000000000000000000808080808004000000000000000000000000000000000000000000008080804000808080808080808004000000000000000000808080800400000000000000000000000000010000808008000000100000000080808020000000000000808080808080808080010100000000000000000080808080ff0300000000807e808020000000000000000000000000000000000000000000000080808001000000000000000000808002000000000000000000000000000000000000000000000000000000000000000000000080808080808080800800008008008080400000000000000000000080808080808080080080808080800200000000000080808080808010000000000000000000000000000000000000808080802000008080808080808080800120000000000000000000000000000000000000000000000000000000008080808010000080800200000080808080808080e07f00000000000000000000000000000000000000000000000000000000008080808080808010000000000000000000000000000000000000000000000000000000000080801000000000000000000000000000000000000000000000008080808020000000000000000080808080200000000000808080c00f00000080808080808080100000000080808080808080800400000080010000000080c07f00000000000000808080808080800800008080802000000000000000000000000000000000000000000000000000000000008080808080f03f008080808080020000000000000000000000000000000000000000000000000000000000000000000000000000000080808008000000000000000080808080808080020000808080808080808010000000000000000000000000008080808080040000000000000080800400000000000000808080809080400000000000008080808080808080020000000000000000000000808080808080400000000000000080040000808080808280808010000080808080020000808080808080400080808080808080800100808080808080801000000080808080800880808080010000000080040000100000000000002080908080408080048080808008000000000080808080080080fc0f0000000000828080a08080808001020080808080808080208080828080808080018080800180808080808080018080808080400000000000000000000080808080808080a02000008080808080804000818080808010000000000000000000808080808080808040fe01000080080080808080801000000000008080080084040004000080808080808080088080208080808080801000000000000080c090c088858404808282808080908040a08080808080800200808002000000000000000000804000808080808080808080010000000000000000000000000000000000000000000000000000000000808080080000000000000000000000000080808080808080802000000000000000000080808080808080080000000000000000000000000000000080808080808080fe070080808080be4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080100000000000000080801000000000000000000000000000000000800200808080808080800880808080808080400000000000000000808080808080040000008080010000000000000000000000000000000000808080800800001000000000000000000000000000000000808040000000000000808080100000000080c01f8080808080808080010000000000000000000000000000008080808001000000000000000000000000000000008002800200000080808080808060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000008080808080808080f001030000000000000000000000000000000000000080808080808010000000000000008080f01f0000808080802000000000000000000000000000000000000000000008000000000000808080f01f0000000000808080808080040000800400000080808080800100000000808080200000000000000000020000000000000000000000000000000080808080808080ff010000008080808080010000808080808080808040000000000000000000908080808080808001000000000000808080808080040080808080808010000000000080808080808080808001000000000080808001000000000000000000808080808002000000808080807c00000000000000000000008280808002000000000000000000000000000000000000000000000000000000000000000000000000808080808080200000000000000000808010000000000000000000000000000000000000808080808002000000000000000000008080808080020000000000000000000000000000000000000000000000000000000000008080800880808002000000808080808080e0ff0700000000000080040000808080808080802000000000a0808080400000008080801000000020000000000000000000000000000000008001000000808002000080800180808080808080020000000000000000008080808080802080808080801000000000000000008080808080808080400000000000000000000080808080800200808080808080800200000080808080800200808040000000000000008080080000000000808080100000000080800100010000808080808002000000000000000020008080808080888080010000000080800400000080808080808080800400000000808080800800000000000000000000000000000000000000008080808080f07f008080808008800800000080020008008080c0800200808080808080800200008080a08001000000000000800200808080088080804080808080808080800100000080808080808080801000808080808280080000000000000000", + "0214e557dd5ace79fc5c741275673cb35719f9137dcb": "0a3173656976616c636f6e733175347461366b6b77303837396361716a77346e6e6576366872387533786c777465666634713310e0cb061a8d14808080808080808004000000000000000000000000000000000000000000808002000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808004808080808080208080808080800800808080c081e087801085809f8080808010808080808084900c808080804000008084808080800100808080808002000000000000808080800880400080808080808080800800000c00808082808080808008000000808080828080200080808040808080800180808080808380100000808080808020000080804000000080804000808080c0808020808080808080088080808080808040808080808080808080018080808080808080208001808080808080801080808080808080801080808080800200000000000000008080808080802000808080808080040010008008000000808080808080f0ffff01070000000000000000808080800480400000000000000000808080808004000000000000000000000000000000000000000000000000808008000000000000808080800800000000000000000080808080040000000000000080808040000000000000000000000000000000008080801000000000000000000000000000000000000080808080800800000000008080808080800100008080808080800200000000008001808080808080808001000000000000000000808020008080800c00000000000000000080100080808080808080100080808080808080800800000000000000000000000000000000808080800c00000000000000000000808080808080808001808088808002000080200000000000000000000000808080808080804000000080808080801080808080808080200000000080808080808080800800000000000000000000000000000080808080808080080000000000000000808080808080100000000000008080808080808001000080808020000000000000000000200080808080808080808001000000000000000000000000000000000000020000008080801000000000808080808080020000008080800100008080800100000080010000000000000000000000000080808080400000000000808080808080808001000000008080808080808020000000000000000000000000808080808080400000004000000000000000000000000000000000000000000080808002000000000000000000000000800400000000000000000000000000000000000000000000000000000040000000008001000000000000000000000000000000000400000000000000000000000000000000000000000000000000000080808080808080040000808080808002000000000000000080808040000000000000000000000000000000000000000000000000000000000080808080808080802000808080080000000000020000008080808080200000000000000000000000008080808080808080100000000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080200080800800808002000000008080808002808080808020000000000000808080808080808080018080808080808020000000000000008080800a0000008080808080808020010000000000000000808080804000808080800880808008000000000000000040000080808080808080801000000000808002808080010000000080808080808080408080802000000040008080800480808080808080a02000000000000000000000000080808080400000808080808008000000808080800800008080808080808080200000000000840400040000000000000080400000008080fc9f80808817008081808080808004000000000000000000000000000000000000000000000000000080808020000000000000000000000000000000008080808080808080010000000000000000000000000080808080808080802000000000000000000000000000000000000000000000000000000000808080c08afc0100000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808080020080808080808080400000000000000000000000000000000000000000008080808080808008008080808004000000000000000000100000000000000000000000000000000000000080100000000000808080808080808001808080808080808080018080020000000000000000000000000000000000808080800100000000000000008080808080808080200000000000808080808080808001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080808080020000000000000000000000000000008080808080800200000000000000000000000000000000000000000000000080808080808080800400000000000000000000808080808080100000000000008080808080800200000000000000000000040000000000808080800100000000000000008080808080801000000000000000008080808008008080808020000008000080200080010000c0808080808010000000000000000000000800000000808080808080800100000000000000000000000000008080808080010000000080808080808080801000000000000080808080808080040002000000000000000000000000000000000000808080808040008080808080010000808080808080808040000000000000000000100000000000008080808080800400000000000000000000000080808080808080800180808001000000000000000000000000000000000000000000008080200000020000008080080000000000000000000000000000000000008080808080020000000000800100000000000000808080808080200000808080808001000080808004000080801000808080200000000000000000000000000080808080808080808001000000000000008080808001000000000000000000000080800100000000000000000000000080808080808080801000000000000000008080800c0000000000000000000080808080808080200000000000000080808080808080800400008080808080808080080000000080808010000000000000000000000000008080300000000000000000000000000000000000000000000000000000000000000000000000008003000000000000000000000000008080808080808080200000000000000000000000000000000000000000000000010000000000000000000000000000000000008080040000000000000000000000000000808080808002000000000000000000808080808080802000000000000000000000808080010000000000008080808080808002000080802000000000000000008080800800000000000000000000000000000000", + "0214e58f7a4f8e69795e1b0afff2a63c4555930f0cb1": "0a3173656976616c636f6e7331756b3868356e757764397534757863326c6c653276307a39326b667337723933307a6377793610e0cb061afa21000080fe0100000000008080808080808080400000000000000000000000803f80808080807f00808080808080f8070080fc110000000000000000000000000000000000008080808080808080108080808080808080400080fc9f808080048080c0f8e180028080808080c0ff1f80808080808080ff0f00fc3380f08e80188080c0ff02808080e07f80808080c0b080088080808080b08880088080808e8080e087800180808080808080fe018cc08080808080c01c808003c0018080181080c0018080808c80030080808090808080800880808080800600808080808080c0018080808080808080180000c080808080808001008080808080f07fe00100008080808080800100000080808080801080808080808080100000808080c00100808080808080800e000000008080800400028180808080808080f8013f808480808080808060000080100000008080808080800800808080808080808003000000080000808080800100008080808080808080fe0103000000000000000080808080808080020000000000000000100000000000000000000000000000008080808480e03f00000000000000000000000000000000000000008080f81f0000000000000000000002000000000080808080808080fc01000000000000008070808080a40880808080e0d7da01808080808080e0feff018080808080808080f001ff01f81380f03f8080f0ff03808080e03f80808080f0b0018080808080807f808080808080e03f8080808080809ce00f8080808080808080ff010380fe838080800380a080188080801e80808080308080808030808080818080038080c001008080808080808080400080018080100000000000008080808080808080088080804000000000809080808080010000000080808080802000000080fe43000000000000008080808080808080088004000080c04000008080808080808010000000008180e07f00018008000080808080c0ff030000000000000000000000000000000080800100000000000000000000000080808080808008000000000020008080808080010000000000000000000000000000000000000000000000000000000000808001000000000080802000000080808080a00800000080808084b801808080808080efbc018080808080808080ff017ff0ff0380c0ff1f808080ff1f80808080fe8f8080048080808080ff0f808080808080ff1f80808080808088fc7f8080808080808080f001ff8180808082c001f03f807e80f88380800c808080208080801c8080808880028080803080808040808080808080800180808080808080801000008080808080020080808080408080808080020080808080808080400000000000c0808080801080808080808080010080808040008080808080808001808004808080808080020000008080803000808080802080988080408080808080c00280808080808040008080fe01000000008080808080801800808080808004808080808080808006008008000080800200802000008080808080f0ff010080808080808080f80f000000000000000000000000000000000000000000000000000000000000000000000000008080808080808080fc010000000000000000000000000000000000000000000000000000808080f0030000000000000000000000000000008080808080803e8080808080808080b40139c0ffa78240828080fc9f0e8080808080f0ff0780809080808080fc0f808080c080808080d801828080808002f81f80fc8780808080018080e007808080f81f82808080f07f8080808087c0018080808080809e800c80808080808080834080c080808080808080010080e00100008080808080c003008080808080c0018080808080800400008080808080808002000000008080018080068080388080808008000080808080808080600008008080800100808080808008008001000000800280808080808080060080808080040080808080080080808080804080040000800e00000080c001808080808080088080808080801000008001000080100080808080808080c0ff01018080808080808008000000000000000000000000000000000080808080808080f81f000000000000000000000000000000808080808080fc030000000000000000000000000000000080800800000000000000000000000000000000000000000000000000008080808080808080f8011f80bc8f948001808080f8ff878010808080808080ffff3f8080808080808080b00154f02f80f0ff03808080ff3f80808080fc1b8080808080f87f808080808080f0ff078080808080808080fc0180808080808080800e84800bc081e0816080e080f0808070808080808004808080800180808080808080028080808080808080400080988080808080f00f0080020080808080208080808080800880808380808080c03f8080808080808080180080018080c080108080800380808080e001000080808080808080800700000080801000000080808080808080800c80808080808080018001000000000000000000808880808080028080800280808004008080808080808480010080808080808080800300a080f83fc0030040e0010030b080801000808001008080fe0100000000000000000000000000000000000000000000000000000000004000008080e00f00000000000000000000000000000080808080808080808001ff03000000808080808080e01f000000000000000000008080808080fe03000080808080808080808001000000008080f87f000000fe03000000808080821080808080fcd009808080808080ffff4380808080808082c0ff011ffcff81f80f80f83f8080f0ff01808080f0ff078080808080fc1f808080808080fe1f80808080808080f87f80808080808080f81c8080808080808080e001059f80808080801c088020008080408080808018808080808c8003808080808038008080808080800c88808080808084800100068080808080608080808080804000008090808080808080400000808080803081108080c080808080080080808080808001000000808002000080f09f8080804080808080808080020081808080808080108010000080808080188088808010808080010000808080800480808080060080808080c0ff8080028088808080808004808080808080800c8080808080808080408080808080a001808180808010008080808080806080808480808080804400908080808080808006008080808080808080fe0100000000808080808080f80700000000000000000000000080808080100000000000000000000000000200008080808080fc07000000808080808040000000000000000000000000008080100000000000000000000000000000000080c0ff010000000000000080808080808080804000000000808080c03f8080808080920680828080808080fedf0199808020a0ffff80388080e0ff3f80808080f0ff0f80808080808080f0ff018180808080808080f001ff07c0ff0f8080fc7f808080e0ef0d8080808080fc0380808080b080e08018808080808080800e06a08080c0818080801080848080808080801080808080a0808080800180808003048030808080068080800c10b08080800140008080a0808040808080808040808080808c808010808080809080804080808080c0800480808080808084800180808080808080400090808080808080800100888040008080801e008080808080828080f001bf80808080806000008001008080808001808080808010808080808080801c808080808080808080018380808080808080800181808001000084ff81808003b08080808004000000000000000000000000000080808080808004000000008090808080fc0100000000000000000000808080807f0000000000000000000000000000808080808080807f0000008080808080808080f80101000000000040000080808080808080040000808080fe01000000808080c0010000008084808080808080408080808080808020848280808080808004e00180e008a080e00100008080c080c082fc03808e808080ff038080808081e0018080408080908080808280010000100000000000000080808080808080800100040000000080804000000003000080802000808080808004008080808080010000000000008080808010008080808080808004808080808080808008000000000000808080802000000000808080808080800800000000000000808080808080fe7f0000000000000000808080808080808080013f0000000080808080808080802000000080c0ff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808084808080fe078080808080808080108090808080808080208006e0879c6080800f80808001808080f05f80808080e0ff038080808180880380808088808018808080808080c0df0180808080808080803e808080808080c007808080808080808080018f808180808080800288808180808038848080b080800180a0800800808080040000000000000080808080800200008080e080100000000000000000808008808080808080f01f0080808080060080808080808080208080808080808008030000000000008080808080020000000000000000000000000080800c8080804000808090808080208080808080800600008080808080808080ff010f0000000000000000000000000000000000000080808080808080408080c0808040848084e0a1808008000000000000000000000000000000000000000000008080808004000000000080801000000000008080808080804000008080808080808001000000808080828080fe07000000000000000080808080808080040000000000808040000c8880800280b0fe828080048080808e86801880808080f03f8080808080bc028080808080c0ff01d081808080808009c0ffc18180808070808080808080808008868080808040ac808080808080800cc0ff81808080068070808080fe80ff0f8080808080708080808080888002808080808080c0030000808080fc1f800c80801880808010008080808080020080808080808140808080808002000810000000008080800400808080808080808080010000000084808080c0ff010180808080f00780800c0000000000000000000000000000000000808004808080808010000080808080808080100080808020000000808080808080ffff3f8080808080808080f801070000000000000000000000000000000000000000000000000000000000008080808080801000000080f01f00000000000000000000000000000000000000f00f000000000000000000000000000000000000008080808080808080e0013f000000804080808009808080bc0c8080808080908680c001818080808080b0d1018080808080808040f83f80c4ff018080c08380808002808080e01f80888080e080800c8080808080c01fa08080808080803f8480818082808080078080808080808080788080808080808080f00180a080a0808080804080908080808080804080fc7f808080e01f808080e080808080020080808080808080408080808010008080808080802080808080808080800c00108c808080808080400000008080f883801880808080801080808080808080048080808080808080408080c0828080808040808080800c8080808080808080018080808080800280808001808020000000000000808080808088808010000400808080018080208080808080802000000080808080808080078080808080808080180030100000008080801000808080e01f0000000080808080ff0f8080808080801f0080808080808080800800000000008080400000000000000000000000000000008080808040000000000000000000000000", + "0214f04b5b9c48b65604a1309e0b0046b4f7cf8c7ef2": "0a3173656976616c636f6e73313770393468387a676b657471666766736e63397371333435376c3863636c686a63347838323510e0cb061af41a000000000000000000000000000080808080808080800400000020008080808004000080808080808080020000008080808080800200000000000000000000000080808080010000808080808080088080808080808080080000000000000100008080808008808080808008000080808080080000000000000080808080010000000080808080801080808004000000000000000000000000000080808080808001000080808080808020000000000000000000000000000000000000008080808080808040000000808080808080808080010000000000808080800100000000028080010000000000808080808080808080010000000000000000000000008080808080400000000000000080808080808080800180a0802000000000000000000000808080801000000000000000000000000000000000000000000000808080808080804000400000000002008080804000000000800100801000000000008080808080801000000000000000000080040080808080808080010008808080808080020000000000000000000000000000000040008082808080803080808080808080804000000080808082808080040080808080808010000000000000000000000000000000008080808080808080800100008080800800000000000000000000000080808004008008808080100080808880808080804000828080808080808020000080800880808080808080802080808080400000000080808080808080804000000000000000000000000000000000000000800800008080808080040000000000000000808080808080020000000000000080802000000000000000000080040000808080808080808010000000000000000000000000000000000000000080808040000000000000000080808080808080800100000000000000000000000000000000000000801000000000000000000000000000000000000080808080808080804000008080808080808080020000000000000000000000000000000080808080808080800280802080808020000080808080800100000800000080808080808044808080808080018090808080808080018080808008802000800880808080828080108080808010808080808080808030000001800100000080800800000000000000008080808080800400808080808080800700000080808080808080808001808080808080808020008080808001000000808080808080200000000080808080808040000000808080808280800100000000800400008080808080800480808008020080808080808004008080808080800880808088808080800180040000000001000000000000000000000080808080808080a010000000008080809080800200000000000000000080808002000000008080808080808080400080808080808040008080808080808080400000000000000000000000801000808080100000000000000080800400000000808080808080808001808080808010000000000000000000808080a0808080100080808080801000000080100000000004808080808080808001008080808080800400808080808080800280c080800800008080808040808080808080804000000000808080808080801000008080808010004000808040000000000000008080808080808080f00190010000000080808080020000000000008080808080808001008080808080804000808080808080808002000000808080808080808008000080808010808080808080040008000000000000000000848004008080808080800180801000008080808080201000000000000000808080010000008080800100000080808080808080800880808080020000808080808080802080808080a001808080808080908008008080a008000080808080808080200000808080020000808080800400008080808080808080080000000000000000800c000080c0018080808080048080208080088080801080808080808080801080808080808001808080808008808080808040000080808080800200008004000000008080808080020080801480888040808480808001809080808080802080808080148080c080808090800880c08080a010000080c88080c091808002809d8990f0818090428080a080c08080a0148091808080808008808080808080801000808080808080808001000080808080800200000000808220000080808008008080808080040080808080808002008080808004008080808080808080084000000080018010808004008080808040008080808080808001808080808004808080200000808080408080808080808002000001000000000000000080848080020000000080808080808080804000000001000000008080808080801000808080801000000000000000000000808040000000000000808080020000000000000000040000008080808080808080100000008080600000000000808080808080808020000000808080808080808004000000000000808080808008008088808080028080808080808080040000008084808080808020000080808080800402808080804000000000008080808040000002000000808080808080040000000080808080800400000000808080801000000000008004000080808080200000808080888080200000000000000000000000008080804080808008008080808080400000000000808081808080900800000080808080080000008080010000008080020000000000808080808080800400c080808004000080801000000000040000000000000000000000808080808004000000040000000000000000000000808080808080020000000000000000000000100000000080808080808008000000808080200080808004000004000000000000000080800400000000008080808080808080080080808080808080200000000000808080028080c0808080801000000080808080800100808080808080808080018080808080808080010080a004808080802000000000000000000080200000c0200004000080040000000000808080020000808080808080010000000000802000808080801000808020000080808080808080028080088080800200008080800200800800808080040080818180808020000020000080010000808080808080802000000080808080018080808080400000000000000000000080808080801000008080808080808080100000808080048080808080800400000000000000008080808080a08010000000000000000000000000008080808080010080808080808080808001808080100000000000000000008080808080808020000000000000000000000000008080808080200080808080048080808080100000000000808080808020000000008080808080808080800180808080808080801000000080c08180808080801000008080808080108040008180808080808020000000008080808080808080400000000000000080808080808004800800008080808010000080400000000000000000808080808080808040008080808080808002000080c0018080808080018080808080800480808003000000f4030000000000008080808080808080040000809080808080020000000080020000001000000000000000000000000000000000000080808080010000000000008080808080804000000000108080808008008080808080801000808080808080800800000004808080808080808002808080808080200000080000000000808080040000808080800400080080808080808004000400000000000000000080808080808001808080808080108080808080808080800100808080808080804000000000000080808080808008000000008080808020000000000000808080808080804000808080803000808080080080c0a00200008080808080808040808080018080808080c280020080808080800200808080808080800480a08080808010808080808080804080800280808088808080808001c0808080808080802080808080808080801080808080808080800280800200000080808080801000808080808180800100008080808080808080200000000000008080804000008080808080400000088480808080808020808080808080802000000000808080600080408080800800008882808020000080808080808080802000808080800100000000808080808080808080018080808020808080809080804000008080010080808080040000800280808080808080400080010800800100000000000000010000008080808080080000001000008080800800808004008080808080808080400000000080808080808080100000808040000080808080028080c080808001c48080809084a09040a080a080800200808080020000000000000000000000000000000000000000000000000000000000000000000000000000008080400080808080080000000000000000000000000000000080100000000000000000000000808040000000000000000000000000008080808040000000000000000000000000000000000000000000000000000800008080808080808002000000000000000000000000000000000000000000000000000000000008000000080000808080100000000000000000808008008008808080800400000000000000004000000080800200808081808080808008808080808080808040000000000000", + "031400d66a1cb50a2473d8f011d369adb117a527072d": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202f0104e9f394135a1819688162864e0ad5570bc35a79e0b3878981fe05639f43", + "03140ab238961abdbc7c99c6693765db290420e2ed87": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20acc1314be641fefb0553b800f02c75ade311b7ba01610ceef9ab2574c3226671", + "0314114c0350b9ce023f98518d9f22a2e2e7548daf66": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20986112d4dfadd3269157ccf8578ebcbb26d52de786f15106c3fabf7c9b6c8afe", + "03141394b86452a60711a0d3637e327d7d080a459b76": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20fbede6aded1c15a36fe4f4a024a700ed0f881b2f0234c2506c9bac3d49ac6b5a", + "0314183388665bac7d2537a91633fdc9ed5d6f46ef37": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20edbe728c97279911d642f9afb38678b70dbb6bed279d1fd07a909b1bc5ced9f8", + "03141aefcc514e41f3dd21f5ce20b7ba3d142eb56256": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2053ec1510c9a5419a50eb0203b15498487aab6fde80f54a0ecebf8672a1c1233c", + "031425abc30b5e07afd6ca59eaa3495ac44d6b5c3026": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207bd5a408389d58a0d1a853a6e522a27f80a5d8d4cdd9dde994747eeb248ffa9b", + "0314314e76481bdea52cea72a30bc185b14f97e7e1d5": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20a6d0dd599cbcd8ed80de14ed3a00e6189fb0f9e4ae102d8a23b0ccd5bbb66ca4", + "0314399548ff09159af3711df1ef08cc243c505130b6": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2048322fbffa7dee4e6a29d4d54460f3cd7d8d9ae42b0512e8d415c2b07a4afd7a", + "03143d4ceb152ca0271e5a9af577d67c828a228c87df": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ebf403a29d26c95c6c7def65134befa554b7da22c6c6b65ae379811c8125cd35", + "031440f909929f7fa9d475e2c6f5a94ac9d6d97cf83d": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20336ad457f0973109704512094ca1b0e7164217d80c0f5c6988e645e51c522778", + "031459e78e0b1133144460575337faa2558399e43661": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a208d219b13145cd459a562503fc5bfb3e3e2157cbd64a29fe5502d6908021c97f5", + "03146ca80ee04179ff609b07f9bbc65c6e47f20d09ca": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d327c4b2166c9259e7fc9fca0da17e803592df562b6a9e9a506e69b7f9e4ea2c", + "03146e900c94f99b249cd8fb6538969e0d9e099c2f52": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203ad6daa88df43464d9d85b3394c64cb056494b7311fed3fa8e9b48065e6376c3", + "03147482d68a8c68fd7204273223d90864207b1558b5": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202e855ce43f04a0b430cc528a0e92660fe932600a8188b7640e07d670f917b8a6", + "0314922357bd8e69e6119d0630f7abbbf7c5e3879f2f": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a200941ca8c1ee67af663b8d11e243203e44d2cefa277ddfd771fc82bac6181bd15", + "03149f1f7b9b3584198f985adb6aa72037731d2a3c73": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2032b22c1036e17dd4fd23c29f397a53044a4c3e9e96f745914ae498c0fef8cd27", + "0314a633a4eeb521dd9f09326bf5c945bc24327c6a66": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b55d8f5835da4285e662b55293d0bb414816f31a0c49262548572c71a0100158", + "0314aa5241dbd04ed2d969216d30c14d408ce3356919": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d0e465aa250bea04fd0801a5da0343e3822720064c4056102f66b5340562f17b", + "0314ab873ff0a3f0bd6d36712004c61ce8bf5970eb60": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2035298402ad4424ecb6187046d090f51ff999062a06952ee6f3dc9b0c5f307e25", + "0314b016593fc42b4a1988404f3d80afef984bd966e2": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203774bed4dacba87333c21ef3142f4b17433ae70f073cfc22531a8a6e3b6e693f", + "0314b1e0490aac5cd08248c284378296d86810410591": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a205e6774aa83afd815bc2f17591b0d8f3eb628c0e7887e03d1d49100fce1a0088b", + "0314ba479c5c63d95550191e3d6434ba557bd5f69508": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203f730b9cc34dffbe86c108820c78a78b2361449dac30fbed2b19af4bc9783322", + "0314cc60893a39b4e2db10ec336489c71f2b537a7c65": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207640b971b95c829abbda696656f8ac31bce8746643d5236826519d0ee000ec14", + "0314cc7dc427a5ee1fea25236dbd78ab8f66db0aec22": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b4913e63bbf7663c57563c53d066cd3fb20f5be24571e1dc4a9afb7902b201b1", + "0314ccc61d60e3dd1121bbbb2ea4c0039f91fd372389": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2061b09f375d43cb51a4b758ce49683e594517b68022b12c0835bb8970f5235fa3", + "0314e1ca4bceb36e12283ccab4a844a97e0c050f005a": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2003430c472b02eddc005da4b3647f825198c83011fb4a9db3da1305147eeee703", + "0314e557dd5ace79fc5c741275673cb35719f9137dcb": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202337039468f1e257f7be2b855fbdb72c24a5042c01d2d7f12e5a671dfafef080", + "0314e58f7a4f8e69795e1b0afff2a63c4555930f0cb1": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ad569a6bc7ecd79b7b336198e3ad9c13dd30e678ebfa33f6e6622efcd46e869c", + "0314f04b5b9c48b65604a1309e0b0046b4f7cf8c7ef2": "0a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20eee1ed384e28627e860c61d58ca4fb916d34ad9f97ccb95c6720780a97ee10df" + }, + "has": [] + }, + "staking": { + "reads": { + "1114064fce2686d171456af5988ce657eb4ac7e8b3c0": "08f3a9fe08", + "111406c26fc1ceb554e2775e5f850ef5c98b3837c71c": "08b7e6f504", + "1114130a25380b8d4edb981389ccc3b590e78f8fe6a6": "08d9e1b61a", + "111421d5ba122ecb253cf76243c3b31fcd1766430aeb": "0884ffa13b", + "111425bf0d36f756e40b14cf6c739514fe8c169f39cc": "08d191e912", + "111433f052e4f7e6777c4afccd6613e0efa38b63ce6c": "08e3f9ac3f", + "111435cd3eb6383e81169d088138aacbc3792968e535": "08fbd99f4f", + "111435d48495046737f4046574293aaa8cbcd6c28c90": "089d81af13", + "111436de192e20837f8d72b3f26412600da5fc277fbe": "08f6f19953", + "11143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6": "0885cea18201", + "111444f7b46b78c4669553833f6942125ba24b4b290e": "08949af014", + "111447462ada49474676b881e9389c755be490b49bec": "08b7eead23", + "111448592266a3c036d8698c1c989a87e79260ca32d3": "08bab8d225", + "11145598f88b7f800c7306d67d1a7c95afa4bb3f69c6": "088c80c148", + "1114595208813bf4d1de510338109a342914808f16c9": "08bfece51a", + "11146c7a35061d2e3b4a02b492220d263f5ec237cda0": "08fc88fb49", + "11146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8": "08dfe2a01f", + "111473921de199b8344034c9c62141b47ead011b6c8f": "088eb0e658", + "1114787f6b6d9ea782923480c17d03f84802cf560c9a": "08bbacf442", + "11147e34318a94e5add4f872ce477099c1067f55ffe2": "08d5b9e242", + "1114805118d40d8197bf88132b217a6b55f79cd7dc74": "0890accd1a", + "11148d02754dbcb739916788ee56633e12916d372039": "08bfdfcd48", + "1114a1909b17135d3469300ccae4c445df07e1f4cc09": "0892a6c04f", + "1114aae0f95540b04758f62b4187e10b5fd09a9f5db9": "08c08fbb12", + "1114abffa229018a0cce93405cfcf1e7c2541e89d3c2": "08ff9ed633", + "1114aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd": "08c3f8b35b", + "1114af227c7f56980d0d321efcbcc1259d0d54426223": "08b283b91a", + "1114ba77322d09f457e5d5c26f459919617654bff49f": "08b9e9ff3b", + "1114bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92": "08dcdeb237", + "1114be96d36f61c8fbb6cd1e07de16de0805f5d55dd6": "08efc08616", + "1114c2e7fc9fb3930704faeac35d973bb1f78da8e711": "08b9c9ee14", + "1114c81136fb247de77e9c634f2d21c3aee7ef3ebc5d": "08c4f9f048", + "1114c8394888bba6ec2dd321db031032e2f79ed91104": "08c2c39307", + "1114d065447e409820fec8ddb630995f8fa1302094fe": "08d4bf8257", + "1114d87251b6de26392467c32cf125d736eed036e088": "08f2e79247", + "1114de73ab1206104a5b2588b7a6037be3020eb36dde": "08dc928f14", + "1114dee81d76ca716b870c8f9d54134610ec90459a6e": "08e9bd8030", + "1114e1be9f6d833cf218a37ee352ae1479dee0a91240": "08e6abc340", + "1114e6f732543aad0c3e9b15dfa61ba7cc375c912e21": "08ac9c9a69", + "1114f23a595fb5a238f33ea41ed21906d0d83353bb81": "08dbe6af1c", + "2114064fce2686d171456af5988ce657eb4ac7e8b3c0": "0a3173656976616c6f70657231716538757566357836396335323668346e7a787776346c7466747237337637716e6b79706c6112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a206c90f00323c0de18c521026359f0f52b69c466ae2bfb83e16049a80e55c57b2320032a0e3138383436393633363931323937322031383834363936333639313239373030303030303030303030303030303030303a780a095374616b656369746f1210443136453236453543383135344531371a1968747470733a2f2f7777772e7374616b656369746f2e636f6d22157365637572697479407374616b656369746f2e64652a275365637572696e67202620446563656e7472616c697a696e6720506f53204e6574776f726b732e4a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113230303030303030303030303030303030120b08ecf9bca30610afd892635a0131", + "211406c26fc1ceb554e2775e5f850ef5c98b3837c71c": "0a3173656976616c6f70657231716d70786c7377776b3432777961363774377a7361617766337675723033637565767373306812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20640f6ee2e5e582fe9efdfdbce26a2239d68e35798d4189b29d1437e99c323a0e20032a0e3130333138363437353630393639322031303331383634373536303936393030303030303030303030303030303030303ab8010a0c5032502e6f726720f09f92991210434235433037463744363435383430331a0f68747470733a2f2f7032702e6f72672217636f736d6f732d7365637572697479407032702e6f72672a6c5032502e6f7267202d2061206c656164696e6720696e737469747574696f6e616c207374616b696e672070726f76696465722e205374616b65207769746820757320666f722061207365637572652c2072656c6961626c6520616e642073696d706c6520736572766963652e40efb397564a0c088ea486ca061085b7f1e002524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113235303030303030303030303030303030120c08f3a3f2c70610839c84ab015a0131", + "2114130a25380b8d4edb981389ccc3b590e78f8fe6a6": "0a3173656976616c6f706572317a76397a32777174333438646878716e3338787638647673753738636c65347873326364663412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b4913e63bbf7663c57563c53d066cd3fb20f5be24571e1dc4a9afb7902b201b120032a0e3535343233313933333831353433322035353432333139333338313534333030303030303030303030303030303030303ab7010a06456e69676d611210363232333639374143413234413446461a1d68747470733a2f2f656e69676d612d76616c696461746f722e636f6d2f221c636f6e7461637440656e69676d612d76616c696461746f722e636f6d2a5e50726f6f66206f66205374616b652056616c696461746f72206f6e20646966666572656e742070726f6a65637473202d2d2050617373696f6e6174652061626f7574204461746120536369656e636520616e6420546563686e6f6c6f67794a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c0887dff5a606109aa7ecc0035a0131", + "211421d5ba122ecb253cf76243c3b31fcd1766430aeb": "0a3173656976616c6f706572317938326d3579337765766a6e65616d7a6730706d783837647a616e79787a6874306b6570766e12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203f730b9cc34dffbe86c108820c78a78b2361449dac30fbed2b19af4bc978332220032a0f31323432383839303030323439323532213132343238383930303032343932353030303030303030303030303030303030303a520a074669676d656e741210453546323734423837304244413031441a1268747470733a2f2f6669676d656e742e696f22137365637572697479406669676d656e742e696f2a0c4669676d656e7420496e632e40c09aa54b4a0b08808cd6c40610f0adc24f524b0a3b0a11353030303030303030303030303030303012123530303030303030303030303030303030301a12313030303030303030303030303030303030120c08e385efad0610a08ffbf3025a0131", + "211425bf0d36f756e40b14cf6c739514fe8c169f39cc": "0a3173656976616c6f70657231796b6c7336646868326d6a716b397830643365653239383733737466377777766564636a6d6812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2027e373c7f48b0dffedbda2b45e88190dd370dc6812f1ebaf88362b2bd6f89d7020032a0e3339343731333133343639383833322033393437313331333436393838333030303030303030303030303030303030303ab3010a0e436f696e616765207820444149431210433932433639363544383946303741331a1468747470733a2f2f646169632e6361706974616c22136f666669636540646169632e6361706974616c2a64546865206f6666696369616c2076616c696461746f72206e6f64652066726f6d20436f696e6167652028436f696e6167652e4d65646961292072756e2062792044414943202868747470733a2f2f646169632e6361706974616c2f74656c656772616d294080f78d264a0c08c8a1d5b3061080bcd2c70352440a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113130303030303030303030303030303030120608f086aea3065a0131", + "211433f052e4f7e6777c4afccd6613e0efa38b63ce6c": "0a3173656976616c6f70657231783063393965386875656d68636a687565346e70386338303577396b386e6e767363636d666612430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2035298402ad4424ecb6187046d090f51ff999062a06952ee6f3dc9b0c5f307e2520032a0f31333238353730353930393030343632213133323835373035393039303034363030303030303030303030303030303030303a230a0c42696e616e6365204e6f64651a1368747470733a2f2f62696e616e63652e636f6d40db85a84b4a0c08e7bad7c40610c5c7aaa302524a0a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120c088ca4cfac0610fca5f2df015a0131", + "211435cd3eb6383e81169d088138aacbc3792968e535": "0a3173656976616c6f706572317868786e61643363383671336438676773797532346a37723079356b3365663475686839653212430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d0e465aa250bea04fd0801a5da0343e3822720064c4056102f66b5340562f17b20032a0f31363631393434323732323334373732213136363139343432373232333437373030303030303030303030303030303030303a060a04736569304a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c089bc5e9a6061094bb8fdc035a0131", + "211435d48495046737f4046574293aaa8cbcd6c28c90": "0a3173656976616c6f70657231786832676639677976756d6c677072397773356e34323576686e74763972797377396772347112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2038e954f0c93e481acb3c4ebedcb79b9533a7c76043e4295e390e78f4a48eb3ec20032a0e3430363136303933343630343231322034303631363039333436303432313030303030303030303030303030303030303a620a0c5374616b696e67436162696e1210433035323244463939324230433430371a1868747470733a2f2f7374616b696e67636162696e2e636f6d221872696368617264407374616b696e67636162696e2e636f6d2a0c5374616b696e67436162696e409595d70a4a0c08d9c3b3a8061098b69ada0352450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120608f086aea3065a0131", + "211436de192e20837f8d72b3f26412600da5fc277fbe": "0a3173656976616c6f70657231786d30706a74337173646c633675346e37666a70796371643568377a776c6137747a386d333712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ebf403a29d26c95c6c7def65134befa554b7da22c6c6b65ae379811c8125cd3520032a0f31373434383737393835333032323932213137343438373739383533303232393030303030303030303030303030303030303ada010a11416e63686f72616765204469676974616c1210313744304131313441393046443535461a1568747470733a2f2f616e63686f726167652e636f6d22166b65796261736540616e63686f726c6162732e636f6d2a8301416e63686f72616765204469676974616c206f666665727320616e20756e706172616c6c656c656420636f6d62696e6174696f6e206f662073656375726520637573746f64792c20726567756c61746f727920636f6d706c69616e63652c2070726f6475637420627265616474682c20616e6420636c69656e7420736572766963652e4a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08d6d8e7c70610bdd0c0cb025a0131", + "21143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6": "0a3173656976616c6f7065723138747064657432326b70767377786179656b776e35357279307235616378346b61617575706b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d327c4b2166c9259e7fc9fca0da17e803592df562b6a9e9a506e69b7f9e4ea2c20032a0f32373331383034323138303231353632213237333138303432313830323135363030303030303030303030303030303030303abb010a034134311210383744393932313235334132413945421a0f68747470733a2f2f6134312e696f2f220a646576406134312e696f2a8401413431206973206120626c6f636b636861696e20696e66726173747275637475726520636f6d70616e792e2057652070726f76696465207374616b696e672073657276696365206f6e206d756c7469636861696e2e205374616b6520796f757220746f6b656e2077697468207573206e6f7720616e64206561726e20726577617264732140b5b2d91f4a0c08ebae85b10610eaeeda8703524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08f3acb6a30610f8d9ab8e025a0131", + "211444f7b46b78c4669553833f6942125ba24b4b290e": "0a3173656976616c6f70657231676e6d6d67366d6363336e66323575723861353579796a6d356639356b3267777a736c32703812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20129f3d8c5891810a459e1ebd2aa2065f68386bbaab171f595f9560bd3b7a04bf20032a0e3433373831333936353339303435322034333738313339363533393034353030303030303030303030303030303030303a100a0e6f6273637572617374616b696e674082f5bc4e4a0c08e48ea2c60610e2c2d4a302524b0a3b0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a113130303030303030303030303030303030120c0888f28ab90610cdb3b4d9015a0131", + "211447462ada49474676b881e9389c755be490b49bec": "0a3173656976616c6f706572316761727a346b6a666761723864777970617975666361326d756a677466786c76366b7465303312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207bd5a408389d58a0d1a853a6e522a27f80a5d8d4cdd9dde994747eeb248ffa9b20032a0e3734313531373335363635383230322037343135313733353636353832303030303030303030303030303030303030303a4d0a094d616e7469436f72651210443543464131313441314545314343371a1668747470733a2f2f6d616e7469636f72652e7465616d2216636f6e74616374406d616e7469636f72652e7465616d40bc8db6014a0c088baae6a40610bad1c28c01524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08eef2f3a60610d5a8dca9025a0131", + "211448592266a3c036d8698c1c989a87e79260ca32d3": "0a3173656976616c6f706572316670766a7965347263716d6473367676726a766634706c386a66737635766b6e306c6c61787312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2061b09f375d43cb51a4b758ce49683e594517b68022b12c0835bb8970f5235fa320032a0e3738393435333338373231333832322037383934353333383732313338323030303030303030303030303030303030303a620a085374696e675261791210443141383139334146333930354141431a2168747470733a2f2f6769746875622e636f6d2f4d696b6861696c526164757368612a2152656c6961626c652050726f6f662d6f662d5374616b652056616c696461746f724a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08c1a3f3a606108cbbe29a035a0131", + "21145598f88b7f800c7306d67d1a7c95afa4bb3f69c6": "0a3173656976616c6f70657231326b7630337a6d6c7371783878706b6b3035643865396430356a616e3736777877747064706412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20acc1314be641fefb0553b800f02c75ade311b7ba01610ceef9ab2574c322667120032a0f31353230353939313635393536363432213135323035393931363539353636343030303030303030303030303030303030303a1f0a084f6e65204e6f6465221373656375726974794063686f7275732e6f6e654a00524d0a3d0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a1331303030303030303030303030303030303030120c089388aec80610dec08ef8015a0131", + "2114595208813bf4d1de510338109a342914808f16c9": "0a3173656976616c6f70657231743966713371666d376e67617535677238716766356470667a6a716737396b6636356375303412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20edbe728c97279911d642f9afb38678b70dbb6bed279d1fd07a909b1bc5ced9f820032a0e3536313934363233323931363137322035363139343632333239313631373030303030303030303030303030303030303aaa010a0c496d70657261746f722e636f1210303837384241364245353536433133321a1568747470733a2f2f696d70657261746f722e636f2f2214636f6e7461637440696d70657261746f722e636f2a5b3130302520726566756e64206f6e20646f776e74696d6520736c617368696e67202d2d2050726f66657373696f6e616c2044656c6567617465642050726f6f662d6f662d5374616b65204e6574776f726b2056616c696461746f724a0052450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120608f086aea3065a0131", + "21146c7a35061d2e3b4a02b492220d263f5ec237cda0": "0a3173656976616c6f70657231643361723270736139636135357134356a6733713666336c746d7072306e6471716c7479383712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207640b971b95c829abbda696656f8ac31bce8746643d5236826519d0ee000ec1420032a0f31353531303834373630333739353432213135353130383437363033373935343030303030303030303030303030303030303a060a04736569314a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08a3cce9a60610e794ac3d5a0131", + "21146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8": "0a3173656976616c6f706572316435306b6779646d30327867396b706166613865336a777a38336330757661676b78396d356e12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a200941ca8c1ee67af663b8d11e243203e44d2cefa277ddfd771fc82bac6181bd1520032a0e3635353438363339363238343334322036353534383633393632383433343030303030303030303030303030303030303ab9010a0a4e6f6465732e477572751210323842363732464345364242443536321a1868747470733a2f2f7374616b652e6e6f6465732e6775727522137365637572697479406e6f6465732e677572752a6a47757275206f66206e6f6e2d637573746f6469616c207374616b696e672e2050726f66657373696f6e616c206e6f64652072756e6e696e672c206c6f7720666565732c206265737420757074696d6520616e642032342f3720637573746f6d657220737570706f72742e4a0052490a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120b08a580f3a60610fe82ab7e5a0131", + "211473921de199b8344034c9c62141b47ead011b6c8f": "0a3173656976616c6f70657231777766706d63766568713679716478666363733572647237343571336b6d7930366c3964306412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20eee1ed384e28627e860c61d58ca4fb916d34ad9f97ccb95c6720780a97ee10df20032a0f31383632323637303237363633323232213138363232363730323736363332323030303030303030303030303030303030303a83020a0e6b696e676e6f64657320f09f91911210333045364344333844393732313232321a1568747470733a2f2f6b696e676e6f6465732e636f6d22167365637572697479406b696e676e6f6465732e636f6d2aaf0150726f66657373696f6e616c20506f532076616c696461746f72207365637572696e67206f6e6c7920746865206265737420696e746572636861696e206e6574776f726b732e204a6f696e206f757220636f6d6d756e697479206f662064656c656761746f72732054656c656772616d3a2068747470733a2f2f742e6d652f6b696e676e6f64657320547769747465723a2068747470733a2f2f747769747465722e636f6d2f6b696e676e6f64657340809a9e014a0b089899daa40610aebaae2b524d0a3d0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a1331303030303030303030303030303030303030120c08b3d2f5a606108fc5d4a0035a0131", + "2114787f6b6d9ea782923480c17d03f84802cf560c9a": "0a3173656976616c6f7065723130706c6b6b6d763735377066796479716339377338377a67717438347672793664783671396b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203ad6daa88df43464d9d85b3394c64cb056494b7311fed3fa8e9b48065e6376c320032a0f31343033313832363733323231303432213134303331383236373332323130343030303030303030303030303030303030303a600a064b72616b656e1210463734384134334435423630363645441a1768747470733a2f2f7777772e6b72616b656e2e636f6d2f22106465766f7073407374616b65642e75732a194b72616b656e2045786368616e67652076616c696461746f7240c086bf0d4a0c089ba3bda9061081a0a08803524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08d0d2f1c206109283c2b8025a0131", + "21147e34318a94e5add4f872ce477099c1067f55ffe2": "0a3173656976616c6f7065723130633672727a3535756b6b616637726a656572687078777071656c34746c6c7a73387667667112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203774bed4dacba87333c21ef3142f4b17433ae70f073cfc22531a8a6e3b6e693f20032a0f31343030323530343531323938393132213134303032353034353132393839313030303030303030303030303030303030303a95020a065a656c6c69631210363039433039313633364431333330421a1168747470733a2f2f7a656c6c69632e696f22127365637572697479407a656c6c69632e696f2ad10154686520676f2d746f20626c6f636b636861696e207365637572697479206669726d20666f7220746f70207465616d732c207370656369616c697a696e6720696e20436f736d6f732c2045564d2c205a4b2c204d6f766520284170746f7320616e6420537569292e20576520736f6c766520796f757220686172646573742073656375726974792070726f626c656d732e20547769747465723a2068747470733a2f2f747769747465722e636f6d2f7a656c6c69635f696f2054656c656772616d3a20742e6d652f7a656c6c69635f696f40fcf2c62f4a0b08a8adcab70610cd81973152490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b088783fdaf0610e2d0de345a0131", + "2114805118d40d8197bf88132b217a6b55f79cd7dc74": "0a3173656976616c6f7065723173706733333471647378746d6c7a716e3976736835363634373777643068723536636a73706a12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202337039468f1e257f7be2b855fbdb72c24a5042c01d2d7f12e5a671dfafef08020032a0e3535373933313638313036333434322035353739333136383130363334343030303030303030303030303030303030303ab3020a0b4369746164656c2e6f6e651210454242303345423442423443464341371a1368747470733a2f2f6369746164656c2e6f6e6522126e696b697461406369746164656c2e6f6e652ae8014369746164656c2e6f6e652069732061206d756c74692d6173736574206e6f6e2d637573746f6469616c207374616b696e6720706c6174666f726d2074686174206c65747320616e796f6e65206265636f6d6520612070617274206f6620646563656e7472616c697a656420696e66726173747275637475726520616e64206561726e207061737369766520696e636f6d652e205374616b652077697468206f7572206e6f646573206f7220616e79206f746865722076616c696461746f72206163726f7373206d756c7469706c65206e6574776f726b7320696e20612066657720636c69636b734a0052440a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113330303030303030303030303030303030120608f086aea3065a0131", + "21148d02754dbcb739916788ee56633e12916d372039": "0a3173656976616c6f7065723133357038326e64756b7575657a657567616574787830736a6a396b6e7767706567636374717012430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202f0104e9f394135a1819688162864e0ad5570bc35a79e0b3878981fe05639f4320032a0f31353232363837333536313139383932213135323236383733353631313938393030303030303030303030303030303030303a9c010a0c416361636961204e6f6465731210383343354139444434353446313037302a7a4465657020526f6f747320696e20456e746572707269736520496e6672617374727563747572652e204272616e63686573204163726f737320457665727920436f6e74696e656e742e20596f75722052656c6961626c65204761746577617920746f20446563656e7472616c697a6564204e6574776f726b732e4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08c7bbbdc60610d5c6f9e5015a0131", + "2114a1909b17135d3469300ccae4c445df07e1f4cc09": "0a3173656976616c6f70657231357867666b39636e743536786a76717665746a766733776c716c736c666e716663303364776b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a208d219b13145cd459a562503fc5bfb3e3e2157cbd64a29fe5502d6908021c97f520032a0f31363637323834363638383131373532213136363732383436363838313137353030303030303030303030303030303030303aad010a075354414b454d451210354541443735333533364242393935431a1368747470733a2f2f7374616b656d652e70726f221161646d696e407374616b656d652e70726f2a685354414b454d452068656c70732077656220332e302070726f6a6563747320746f20746573742074686569722070726f647563742c20616e642070726f7669646520746865206d6f737420656666696369656e7420646576656c6f706d656e7420737570706f72744a00524a0a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113130303030303030303030303030303030120c08adabf3a6061081c7b7d8015a0131", + "2114aae0f95540b04758f62b4187e10b5fd09a9f5db9": "0a3173656976616c6f70657231347473306a3432716b70723433613374677872377a7a366c367a646637686465336d6632616512430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2014c347b841def41b11c0ad46b781b1836fe1a354d3b7e66eb75f9722fa565ee720032a0e3338373137333736303031353839322033383731373337363030313538393030303030303030303030303030303030303acc020a034f62691210443534304430323334423341453142381a1168747470733a2f2f6f62692e6d6f6e657922244368656d6963616c42726f7356616c696461746f724070726f746f6e6d61696c2e636f6d2af9014f62692070726f766964657320636f6e76656e69656e742075736572206163636f756e7420736f6c7574696f6e7320666f722077616c6c6574732c2070726f746f636f6c7320616e64206170706c69636174696f6e732e20496620796f7527726520696e746572657374656420696e206f66666572696e6720736565646c657373206f6e626f617264696e672c206163636f756e74207265636f766572792c20617373657420696e6865726974616e63652c2073657373696f6e206b6579207369676e696e67206f7220737562736372697074696f6e7320746f20796f757220757365727320636865636b206f7574206f62692e6d6f6e657940bf95b10a4a0b08a7b1a5a806109096833d52490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08e590f9a60610e9e0c5355a0131", + "2114abffa229018a0cce93405cfcf1e7c2541e89d3c2": "0a3173656976616c6f7065723134306c36793267703367787661793671746e37307265377a327330676e35377a6c366e75707312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2053ec1510c9a5419a50eb0203b15498487aab6fde80f54a0ecebf8672a1c1233c20032a0f31303833363737343337373235303832213130383336373734333737323530383030303030303030303030303030303030303aef010a19204c6176656e6465722e46697665204e6f64657320f09f909d1210463837414444423730304330434339341a1d68747470733a2f2f7777772e6c6176656e646572666976652e636f6d2f221668656c6c6f406c6176656e646572666976652e636f6d2a88013130302520736f667420736c6173682070726f7465637465642e2057652073747269766520746f206d616b652074686520636f736d6f732061206d6f726520686f6c6973746963616c6c792077686f6c65736f6d6520706c6163652e20436f6d6520736179204869212068747470733a2f2f6c696e6b74722e65652f6c6176656e6465726669766540e585d90a4a0c08c99bb4a80610fef3afb80152440a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120608f086aea3065a0131", + "2114aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd": "0a3173656976616c6f7065723134366d3038396c71386d6b71773677306d6d6c68787a3632343767327461686138396174373412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202e855ce43f04a0b430cc528a0e92660fe932600a8188b7640e07d670f917b8a620032a0f31393136393138343334343937353132213139313639313834333434393735313030303030303030303030303030303030303a96020a0b205248494e4f20f09fa68f1210353943363335443143443032464545431a1668747470733a2f2f7268696e6f7374616b652e636f6d2216737570706f7274407268696e6f7374616b652e636f6d2ac401426c6f636b636861696e20696e66726173747275637475726520617420696e737469747574696f6e616c207374616e64617264732e204d756c74692d726567696f6e2072656c696162696c6974792c20656e746572707269736520534c41732c20616e6420736c6173682070726f74656374696f6e20696e737572616e63652e20576520737570706f7274207465616d73206275696c64696e67206f6e205365692e2052656164206d6f72652061742068747470733a2f2f7365692d617069732e636f6d4a0052440a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120608f086aea3065a0131", + "2114af227c7f56980d0d321efcbcc1259d0d54426223": "0a3173656976616c6f7065723134753338636c366b6e717873367673376c6a37767a6676617034327979633372756e7472776312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ad569a6bc7ecd79b7b336198e3ad9c13dd30e678ebfa33f6e6622efcd46e869c20032a0e3535343630323734343738363839322035353436303237343437383638393030303030303030303030303030303030303acc010a0e426c6f636b73636f70652e6e65741210413938463335433133383137314139391a1668747470733a2f2f626c6f636b73636f70652e6e65742219626c6f636b73636f70654070726f746f6e6d61696c2e636f6d2a75457870657269656e636564207465616d206f6620495420656e67696e65657273206275696c64696e6720644170707320616e6420696e6672617374727563747572657320666f7220626c6f636b636861696e2070726f6a65637473206c696b65204e6561722c20536f6c616e6120616e642053756940fad9e1464a0c08f1c6a6c20610f3bf90e001524a0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120b08ecb2f7a60610cfb58f0a5a0131", + "2114ba77322d09f457e5d5c26f459919617654bff49f": "0a3173656976616c6f7065723168666d6e79746766373374377434777a64617a656a787470776532746c61796c7735616d6c3312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20a6d0dd599cbcd8ed80de14ed3a00e6189fb0f9e4ae102d8a23b0ccd5bbb66ca420032a0f31323538323632333339303634373432213132353832363233333930363437343030303030303030303030303030303030303a0f0a0d666964656c697573206e6f64654a0052490a390a113530303030303030303030303030303030121135303030303030303030303030303030301a113130303030303030303030303030303030120c08ab91e1c70610b3def6f1015a0131", + "2114bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92": "0a3173656976616c6f70657231686e6b6b716e7a776d79773635326d7568367766656137786c6667706c6e796a306b7534773412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20336ad457f0973109704512094ca1b0e7164217d80c0f5c6988e645e51c52277820032a0f31313631373436383433353134333832213131363137343638343335313433383030303030303030303030303030303030303aa9010a0c436f736d6f73746174696f6e1210414534433430334136453741413141431a1b68747470733a2f2f7777772e636f736d6f73746174696f6e2e696f221561646d696e407374616d7065722e6e6574776f726b2a53436f736d6f73746174696f6e2076616c696461746f72206e6f64652e2044656c656761746520796f757220746f6b656e7320616e64205374617274204561726e696e67205374616b696e6720526577617264734a0052450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12323030303030303030303030303030303030120608f086aea3065a0131", + "2114be96d36f61c8fbb6cd1e07de16de0805f5d55dd6": "0a3173656976616c6f7065723168367464786d6d706572616d646e6737716c307064687367716836613268776b78717466796712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203e2ac177d0205ee4fd937e8b35a6135c7eac959c063a21423f5f91fae13b07b920032a0e3436323433393531373835303832322034363234333935313738353038323030303030303030303030303030303030303a0b0a097a687374616b696e674a00523c0a2d0a13313030303030303030303030303030303030301213313030303030303030303030303030303030301a0130120b08c5e6f4bd06108caddc685a0131", + "2114c2e7fc9fb3930704faeac35d973bb1f78da8e711": "0a3173656976616c6f7065723163746e6c6538616e6a7672736637683263647765777761333737783633656333756b6665366812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2093cfb8ef297202cc6a368739569d0e946d3b92a8b30744e0ec254a8582e95a9020032a0e3433373534363831313533323336322034333735343638313135333233363030303030303030303030303030303030303aa6010a094b7564617361694a501a0d6b7564617361692e636f2e6a70221b76616c696461746f722d646576406b7564617361692e636f2e6a702a6d4c61726765737420636f6d6d756e6974792076616c696461746f7220696e204a6170616e206f66666572696e672076616c69646174696e672c20656475636174696f6e20616e642070656e6574726174696f6e20696e746f20746865204a6170616e657365206d61726b65742e4080e690194a0c08c58899ae0610a9e7deee01524a0a3b0a11353030303030303030303030303030303012123235303030303030303030303030303030301a12313030303030303030303030303030303030120b08d9c995ad0610e0efec435a0131", + "2114c81136fb247de77e9c634f2d21c3aee7ef3ebc5d": "0a3173656976616c6f706572316571676e6437657930686e686138727266756b6a72736177756c686e61307a6167636736613412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a205e6774aa83afd815bc2f17591b0d8f3eb628c0e7887e03d1d49100fce1a0088b20032a0f31353238343535303830333633333532213135323834353530383033363333353030303030303030303030303030303030303ae3010a065374616b696e1210383344333030434234324430363936321a1268747470733a2f2f7374616b696e2e636f6d22137365637572697479407374616b696e2e636f6d2a9d01457870657269656e63656420656e74657270726973652076616c696461746f722072756e6e696e672050726f6f662d6f662d5374616b65206e6f64657320666f722074686520436f736d6f732065636f73797374656d20616e64206265796f6e642e205669736974206f7572207765627369746520666f72206d6f726520696e666f726d6174696f6e3a2068747470733a2f2f7374616b696e2e636f6d4a0052440a3a0a11353030303030303030303030303030303012123235303030303030303030303030303030301a113530303030303030303030303030303030120608f086aea3065a0131", + "2114c8394888bba6ec2dd321db031032e2f79ed91104": "0a3173656976616c6f7065723165717535337a396d356d6b7a6d3565706d7670337176687a373730646a79677963687567327612430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a201fa48908c73ba7f06f319c3c6501171c1eddc548cdc9917b2d990f6896a57c9620032a0e3135303030303032303034353435322031353030303030323030343534353030303030303030303030303030303030303a090a074248204e6f646540c7d8e0554a0b08c781ebc90610978abd3052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08c4b0f8c80610a6e4fb365a0131", + "2114d065447e409820fec8ddb630995f8fa1302094fe": "0a3173656976616c6f7065723136706a35676c6a716e717330616a78616b6363666a6875303579637a7039383734336374677912430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2032b22c1036e17dd4fd23c29f397a53044a4c3e9e96f745914ae498c0fef8cd2720032a0f31383234393331343030373232333932213138323439333134303037323233393030303030303030303030303030303030303af8010a0a43686f727573204f6e651210303042373944363839423744433143451a1268747470733a2f2f63686f7275732e6f6e65221373656375726974794063686f7275732e6f6e652aae015365637572652053656920616e6420736861706520697473206675747572652062792064656c65676174696e6720746f2043686f727573204f6e652c206120686967686c792073656375726520616e6420737461626c652076616c696461746f722e2042792064656c65676174696e672c20796f7520616772656520746f20746865207465726d73206f6620736572766963652061743a2068747470733a2f2f63686f7275732e6f6e652f746f734a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08f0eef3a6061080a3d5a1015a0131", + "2114d87251b6de26392467c32cf125d736eed036e088": "0a3173656976616c6f706572316d70653972646b377963756a67653772396e636a7434656b616d677264637967767a7771653812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2003430c472b02eddc005da4b3647f825198c83011fb4a9db3da1305147eeee70320032a0f31343932303630303235343431323032213134393230363030323534343132303030303030303030303030303030303030303ad7010a0c706f6c6b616368752e636f6d1210304136414630324431353537453542341a1468747470733a2f2f706f6c6b616368752e636f6d221268656c6c6f40706f6c6b616368752e636f6d2a8a01506f6c6b61636875206973207468652074727573746564207374616b696e6720736572766963652070726f766964657220666f7220626c6f636b636861696e2070726f6a656374732e203130302520726566756e6420666f7220646f776e74696d6520736c6173682e20436f6e746163742075732061742068656c6c6f40706f6c6b616368752e636f6d4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c089bedd4a30610aafae3c6025a0131", + "2114de73ab1206104a5b2588b7a6037be3020eb36dde": "0a3173656976616c6f706572316d6565366b7973787a7039396b6676676b376e7178376c7271673874786d77376b617039677912430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a208d6e39491ee977ba5665e8c3c8ae000ec9d4a43f47960e89807b8178d420e50c20032a0e3432313931313936323334333236322034323139313139363233343332363030303030303030303030303030303030303ae6020a11206b6a6e6f6465732e636f6d20f09fa6841210314335414344324545463336334333411a2868747470733a2f2f73657276696365732e6b6a6e6f6465732e636f6d2f6d61696e6e65742f7365692a9402547275737465642050726f6f66206f66205374616b652076616c696461746f72206163726f737320436f736d6f7320756e6976657273652e204163746976652065636f73797374656d20636f6e7472696275746f722c204942432072656c6179657220616e6420636861696e20736572766963652070726f76696465722073696e636520323032312e2057652064656c6976657220746f702d6e6f7463682073656375726520616e642072656c6961626c6520696e66726173747275637475726520666f7220436f736d6f732070726f6a656374732e2032342f37206d6f6e69746f72696e672077697468206e6f20736c617368696e6720686973746f727920696e206f757220747261636b207265636f72642e4a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08aaaa9ba90610e486e44d5a0131", + "2114dee81d76ca716b870c8f9d54134610ec90459a6e": "0a3173656976616c6f706572316d6d357036616b3277393463777279306e34327078337373616a677974786e7766766434773812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20986112d4dfadd3269157ccf8578ebcbb26d52de786f15106c3fabf7c9b6c8afe20032a0f31303036373132303938313933333032213130303637313230393831393333303030303030303030303030303030303030303aeb010a0843726f736e6573741210354631443641433745413538383637361a1668747470733a2f2f63726f732d6e6573742e636f6d2f2219636861696e6d61737465724063726f732d6e6573742e636f6d2a99015765206f7065726174652073656375726520616e6420726564756e64616e742076616c696461746f7220696e66726173747275637475726520666f7220506f5320626c6f636b636861696e7320616e64206163746976656c7920706172746963697061746520696e204942432072656c6179696e672077697468206f76657220243335304d20546f74616c2052656c617965642056616c75654a00524a0a3a0a11353030303030303030303030303030303012123135303030303030303030303030303030301a113130303030303030303030303030303030120c08a5b0f3a60610e5a697ac025a0131", + "2114e1be9f6d833cf218a37ee352ae1479dee0a91240": "0a3173656976616c6f7065723175786c66376d7672386e657033676d3775646632753972656d6d73326a796a7136656533356712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20fbede6aded1c15a36fe4f4a024a700ed0f881b2f0234c2506c9bac3d49ac6b5a20032a0f31333533323130363236313735363232213133353332313036323631373536323030303030303030303030303030303030303a6f0a044b696c6e1210394237343336344135453532364245441a1368747470733a2f2f7777772e6b696c6e2e666922107365637572697479406b696c6e2e66692a2e44656d6f637261746973696e672076616c7565206372656174696f6e20696e206469676974616c206173736574734a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08e1dbdac60610df93b4fc025a0131", + "2114e6f732543aad0c3e9b15dfa61ba7cc375c912e21": "0a3173656976616c6f70657231756d6d6e7934703634357872617863346d376e7068663776786177667a74337035686e34377412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2048322fbffa7dee4e6a29d4d54460f3cd7d8d9ae42b0512e8d415c2b07a4afd7a20032a0f32323036333035373239353838323932213232303633303537323935383832393030303030303030303030303030303030303aa3010a09457665727374616b651210454635414337304330304245434544431a1568747470733a2f2f657665727374616b652e6f6e652a6d457665727374616b652069732074686520e2849631207374616b696e6720696e66726173747275637475726520706c6174666f726d2c20747275737465642062792072657461696c20616e6420696e737469747574696f6e616c20636c69656e747320776f726c64776964652e4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08e290f3a60610aeead4cc035a0131", + "2114f23a595fb5a238f33ea41ed21906d0d83353bb81": "0a3173656976616c6f70657231376761396a6861343567753078303479726d66706a706b736d716534387775707a6b356a657812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b55d8f5835da4285e662b55293d0bb414816f31a0c49262548572c71a010015820032a0e3539353033343531333132373237322035393530333435313331323732373030303030303030303030303030303030303aa6010a0c416374697665204e6f6465731210413245413744453736414435374531411a1a68747470733a2f2f7777772e6163746976656e6f6465732e696f2a68576520536b79726f636b657420796f7572205374616b652120486967686c7920417661696c61626c6520456e746572707269736520496e6672617374727563747572652077697468206d756c7469706c65206e6f6465732061726f756e642074686520776f726c644a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113530303030303030303030303030303030120c08d791f3a606109ecbf6e9025a0131", + "221400d66a1cb50a2473d8f011d369adb117a527072d": "8d02754dbcb739916788ee56633e12916d372039", + "22140ab238961abdbc7c99c6693765db290420e2ed87": "5598f88b7f800c7306d67d1a7c95afa4bb3f69c6", + "2214114c0350b9ce023f98518d9f22a2e2e7548daf66": "dee81d76ca716b870c8f9d54134610ec90459a6e", + "22141394b86452a60711a0d3637e327d7d080a459b76": "e1be9f6d833cf218a37ee352ae1479dee0a91240", + "2214183388665bac7d2537a91633fdc9ed5d6f46ef37": "595208813bf4d1de510338109a342914808f16c9", + "22141aefcc514e41f3dd21f5ce20b7ba3d142eb56256": "abffa229018a0cce93405cfcf1e7c2541e89d3c2", + "221425abc30b5e07afd6ca59eaa3495ac44d6b5c3026": "47462ada49474676b881e9389c755be490b49bec", + "2214314e76481bdea52cea72a30bc185b14f97e7e1d5": "ba77322d09f457e5d5c26f459919617654bff49f", + "2214399548ff09159af3711df1ef08cc243c505130b6": "e6f732543aad0c3e9b15dfa61ba7cc375c912e21", + "22143d4ceb152ca0271e5a9af577d67c828a228c87df": "36de192e20837f8d72b3f26412600da5fc277fbe", + "221440f909929f7fa9d475e2c6f5a94ac9d6d97cf83d": "bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92", + "221459e78e0b1133144460575337faa2558399e43661": "a1909b17135d3469300ccae4c445df07e1f4cc09", + "22146ca80ee04179ff609b07f9bbc65c6e47f20d09ca": "3ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6", + "22146e900c94f99b249cd8fb6538969e0d9e099c2f52": "787f6b6d9ea782923480c17d03f84802cf560c9a", + "22147482d68a8c68fd7204273223d90864207b1558b5": "aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd", + "2214922357bd8e69e6119d0630f7abbbf7c5e3879f2f": "6d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8", + "22149f1f7b9b3584198f985adb6aa72037731d2a3c73": "d065447e409820fec8ddb630995f8fa1302094fe", + "2214a633a4eeb521dd9f09326bf5c945bc24327c6a66": "f23a595fb5a238f33ea41ed21906d0d83353bb81", + "2214aa5241dbd04ed2d969216d30c14d408ce3356919": "35cd3eb6383e81169d088138aacbc3792968e535", + "2214ab873ff0a3f0bd6d36712004c61ce8bf5970eb60": "33f052e4f7e6777c4afccd6613e0efa38b63ce6c", + "2214b016593fc42b4a1988404f3d80afef984bd966e2": "7e34318a94e5add4f872ce477099c1067f55ffe2", + "2214b1e0490aac5cd08248c284378296d86810410591": "c81136fb247de77e9c634f2d21c3aee7ef3ebc5d", + "2214ba479c5c63d95550191e3d6434ba557bd5f69508": "21d5ba122ecb253cf76243c3b31fcd1766430aeb", + "2214cc60893a39b4e2db10ec336489c71f2b537a7c65": "6c7a35061d2e3b4a02b492220d263f5ec237cda0", + "2214cc7dc427a5ee1fea25236dbd78ab8f66db0aec22": "130a25380b8d4edb981389ccc3b590e78f8fe6a6", + "2214ccc61d60e3dd1121bbbb2ea4c0039f91fd372389": "48592266a3c036d8698c1c989a87e79260ca32d3", + "2214e1ca4bceb36e12283ccab4a844a97e0c050f005a": "d87251b6de26392467c32cf125d736eed036e088", + "2214e557dd5ace79fc5c741275673cb35719f9137dcb": "805118d40d8197bf88132b217a6b55f79cd7dc74", + "2214e58f7a4f8e69795e1b0afff2a63c4555930f0cb1": "af227c7f56980d0d321efcbcc1259d0d54426223", + "2214f04b5b9c48b65604a1309e0b0046b4f7cf8c7ef2": "73921de199b8344034c9c62141b47ead011b6c8f", + "50313837363738313433": "", + "50313837363738313434": "0a8f030a001209706163696669632d3118c0fbbe59220b08ede7efca0610bd8fb60c2a480a2092ce9ccce16b0185c517b8b9b24d1553d7dcdb5e603b65f9ef7be0865eb3b37912240801122092ce9ccce16b0185c517b8b9b24d1553d7dcdb5e603b65f9ef7be0865eb3b37932208b878c44681af5efcca0734df2f03a38e0d46c0b7d35a9e0aefcbe30a20b90293a20a1535038e30695fbdf8e811cc13b9a986640aa183372da3d91625d2befd99b4a42205b70e5509b4dd03d239f4e8902cb798c4bdb04b9d1c8af7440f5fca7cf02fca84a205b70e5509b4dd03d239f4e8902cb798c4bdb04b9d1c8af7440f5fca7cf02fca852207d0b88f8835db6e92ec4e959ccd9324052c68794bc42567cfa45fb176ed6679a5a205eb3594ac9367fad55ee46bdf71b9527f21cdbbe615fd6ce98ed25c737df193e622018d739a334b29d632120a9736f068bfcc94db87bef1476ea5ae792946d4d7eb86a20e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8557214b016593fc42b4a1988404f3d80afef984bd966e212ce030a3173656976616c6f7065723138747064657432326b70767377786179656b776e35357279307235616378346b61617575706b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d327c4b2166c9259e7fc9fca0da17e803592df562b6a9e9a506e69b7f9e4ea2c20032a0f32373331383034323138303231353632213237333138303432313830323135363030303030303030303030303030303030303abb010a034134311210383744393932313235334132413945421a0f68747470733a2f2f6134312e696f2f220a646576406134312e696f2a8401413431206973206120626c6f636b636861696e20696e66726173747275637475726520636f6d70616e792e2057652070726f76696465207374616b696e672073657276696365206f6e206d756c7469636861696e2e205374616b6520796f757220746f6b656e2077697468207573206e6f7720616e64206561726e20726577617264732140b5b2d91f4a0c08ebae85b10610eaeeda8703524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08f3acb6a30610f8d9ab8e025a013112a5030a3173656976616c6f70657231756d6d6e7934703634357872617863346d376e7068663776786177667a74337035686e34377412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2048322fbffa7dee4e6a29d4d54460f3cd7d8d9ae42b0512e8d415c2b07a4afd7a20032a0f32323036333035373239353838323932213232303633303537323935383832393030303030303030303030303030303030303aa3010a09457665727374616b651210454635414337304330304245434544431a1568747470733a2f2f657665727374616b652e6f6e652a6d457665727374616b652069732074686520e2849631207374616b696e6720696e66726173747275637475726520706c6174666f726d2c20747275737465642062792072657461696c20616e6420696e737469747574696f6e616c20636c69656e747320776f726c64776964652e4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08e290f3a60610aeead4cc035a01311292040a3173656976616c6f7065723134366d3038396c71386d6b71773677306d6d6c68787a3632343767327461686138396174373412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202e855ce43f04a0b430cc528a0e92660fe932600a8188b7640e07d670f917b8a620032a0f31393136393138343334343937353132213139313639313834333434393735313030303030303030303030303030303030303a96020a0b205248494e4f20f09fa68f1210353943363335443143443032464545431a1668747470733a2f2f7268696e6f7374616b652e636f6d2216737570706f7274407268696e6f7374616b652e636f6d2ac401426c6f636b636861696e20696e66726173747275637475726520617420696e737469747574696f6e616c207374616e64617264732e204d756c74692d726567696f6e2072656c696162696c6974792c20656e746572707269736520534c41732c20616e6420736c6173682070726f74656374696f6e20696e737572616e63652e20576520737570706f7274207465616d73206275696c64696e67206f6e205365692e2052656164206d6f72652061742068747470733a2f2f7365692d617069732e636f6d4a0052440a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120608f086aea3065a01311298040a3173656976616c6f70657231777766706d63766568713679716478666363733572647237343571336b6d7930366c3964306412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20eee1ed384e28627e860c61d58ca4fb916d34ad9f97ccb95c6720780a97ee10df20032a0f31383632323637303237363633323232213138363232363730323736363332323030303030303030303030303030303030303a83020a0e6b696e676e6f64657320f09f91911210333045364344333844393732313232321a1568747470733a2f2f6b696e676e6f6465732e636f6d22167365637572697479406b696e676e6f6465732e636f6d2aaf0150726f66657373696f6e616c20506f532076616c696461746f72207365637572696e67206f6e6c7920746865206265737420696e746572636861696e206e6574776f726b732e204a6f696e206f757220636f6d6d756e697479206f662064656c656761746f72732054656c656772616d3a2068747470733a2f2f742e6d652f6b696e676e6f64657320547769747465723a2068747470733a2f2f747769747465722e636f6d2f6b696e676e6f64657340809a9e014a0b089899daa40610aebaae2b524d0a3d0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a1331303030303030303030303030303030303030120c08b3d2f5a606108fc5d4a0035a013112fb030a3173656976616c6f7065723136706a35676c6a716e717330616a78616b6363666a6875303579637a7039383734336374677912430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2032b22c1036e17dd4fd23c29f397a53044a4c3e9e96f745914ae498c0fef8cd2720032a0f31383234393331343030373232333932213138323439333134303037323233393030303030303030303030303030303030303af8010a0a43686f727573204f6e651210303042373944363839423744433143451a1268747470733a2f2f63686f7275732e6f6e65221373656375726974794063686f7275732e6f6e652aae015365637572652053656920616e6420736861706520697473206675747572652062792064656c65676174696e6720746f2043686f727573204f6e652c206120686967686c792073656375726520616e6420737461626c652076616c696461746f722e2042792064656c65676174696e672c20796f7520616772656520746f20746865207465726d73206f6620736572766963652061743a2068747470733a2f2f63686f7275732e6f6e652f746f734a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08f0eef3a6061080a3d5a1015a013112dd030a3173656976616c6f70657231786d30706a74337173646c633675346e37666a70796371643568377a776c6137747a386d333712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ebf403a29d26c95c6c7def65134befa554b7da22c6c6b65ae379811c8125cd3520032a0f31373434383736383830383938353332213137343438373638383038393835333030303030303030303030303030303030303ada010a11416e63686f72616765204469676974616c1210313744304131313441393046443535461a1568747470733a2f2f616e63686f726167652e636f6d22166b65796261736540616e63686f726c6162732e636f6d2a8301416e63686f72616765204469676974616c206f666665727320616e20756e706172616c6c656c656420636f6d62696e6174696f6e206f662073656375726520637573746f64792c20726567756c61746f727920636f6d706c69616e63652c2070726f6475637420627265616474682c20616e6420636c69656e7420736572766963652e4a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08d6d8e7c70610bdd0c0cb025a013112af030a3173656976616c6f70657231357867666b39636e743536786a76717665746a766733776c716c736c666e716663303364776b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a208d219b13145cd459a562503fc5bfb3e3e2157cbd64a29fe5502d6908021c97f520032a0f31363637323834363638383131373532213136363732383436363838313137353030303030303030303030303030303030303aad010a075354414b454d451210354541443735333533364242393935431a1368747470733a2f2f7374616b656d652e70726f221161646d696e407374616b656d652e70726f2a685354414b454d452068656c70732077656220332e302070726f6a6563747320746f20746573742074686569722070726f647563742c20616e642070726f7669646520746865206d6f737420656666696369656e7420646576656c6f706d656e7420737570706f72744a00524a0a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113130303030303030303030303030303030120c08adabf3a6061081c7b7d8015a01311287020a3173656976616c6f706572317868786e61643363383671336438676773797532346a37723079356b3365663475686839653212430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20d0e465aa250bea04fd0801a5da0343e3822720064c4056102f66b5340562f17b20032a0f31363631393431393532323334373732213136363139343139353232333437373030303030303030303030303030303030303a060a04736569304a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c089bc5e9a6061094bb8fdc035a01311286020a3173656976616c6f70657231643361723270736139636135357134356a6733713666336c746d7072306e6471716c7479383712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207640b971b95c829abbda696656f8ac31bce8746643d5236826519d0ee000ec1420032a0f31353531303834373630333739353432213135353130383437363033373935343030303030303030303030303030303030303a060a04736569314a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08a3cce9a60610e794ac3d5a013112df030a3173656976616c6f706572316571676e6437657930686e686138727266756b6a72736177756c686e61307a6167636736613412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a205e6774aa83afd815bc2f17591b0d8f3eb628c0e7887e03d1d49100fce1a0088b20032a0f31353238343534393930333633333532213135323834353439393033363333353030303030303030303030303030303030303ae3010a065374616b696e1210383344333030434234324430363936321a1268747470733a2f2f7374616b696e2e636f6d22137365637572697479407374616b696e2e636f6d2a9d01457870657269656e63656420656e74657270726973652076616c696461746f722072756e6e696e672050726f6f662d6f662d5374616b65206e6f64657320666f722074686520436f736d6f732065636f73797374656d20616e64206265796f6e642e205669736974206f7572207765627369746520666f72206d6f726520696e666f726d6174696f6e3a2068747470733a2f2f7374616b696e2e636f6d4a0052440a3a0a11353030303030303030303030303030303012123235303030303030303030303030303030301a113530303030303030303030303030303030120608f086aea3065a0131129e030a3173656976616c6f7065723133357038326e64756b7575657a657567616574787830736a6a396b6e7767706567636374717012430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202f0104e9f394135a1819688162864e0ad5570bc35a79e0b3878981fe05639f4320032a0f31353232363837333536313139383932213135323236383733353631313938393030303030303030303030303030303030303a9c010a0c416361636961204e6f6465731210383343354139444434353446313037302a7a4465657020526f6f747320696e20456e746572707269736520496e6672617374727563747572652e204272616e63686573204163726f737320457665727920436f6e74696e656e742e20596f75722052656c6961626c65204761746577617920746f20446563656e7472616c697a6564204e6574776f726b732e4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08c7bbbdc60610d5c6f9e5015a013112a3020a3173656976616c6f70657231326b7630337a6d6c7371783878706b6b3035643865396430356a616e3736777877747064706412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20acc1314be641fefb0553b800f02c75ade311b7ba01610ceef9ab2574c322667120032a0f31353230353939313635393536363432213135323035393931363539353636343030303030303030303030303030303030303a1f0a084f6e65204e6f6465221373656375726974794063686f7275732e6f6e654a00524d0a3d0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a1331303030303030303030303030303030303030120c089388aec80610dec08ef8015a013112d9030a3173656976616c6f706572316d70653972646b377963756a67653772396e636a7434656b616d677264637967767a7771653812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2003430c472b02eddc005da4b3647f825198c83011fb4a9db3da1305147eeee70320032a0f31343932303630303235343431323032213134393230363030323534343132303030303030303030303030303030303030303ad7010a0c706f6c6b616368752e636f6d1210304136414630324431353537453542341a1468747470733a2f2f706f6c6b616368752e636f6d221268656c6c6f40706f6c6b616368752e636f6d2a8a01506f6c6b61636875206973207468652074727573746564207374616b696e6720736572766963652070726f766964657220666f7220626c6f636b636861696e2070726f6a656374732e203130302520726566756e6420666f7220646f776e74696d6520736c6173682e20436f6e746163742075732061742068656c6c6f40706f6c6b616368752e636f6d4a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c089bedd4a30610aafae3c6025a013112f2020a3173656976616c6f7065723130706c6b6b6d763735377066796479716339377338377a67717438347672793664783671396b12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203ad6daa88df43464d9d85b3394c64cb056494b7311fed3fa8e9b48065e6376c320032a0f31343032393035323836323633373432213134303239303532383632363337343030303030303030303030303030303030303a600a064b72616b656e1210463734384134334435423630363645441a1768747470733a2f2f7777772e6b72616b656e2e636f6d2f22106465766f7073407374616b65642e75732a194b72616b656e2045786368616e67652076616c696461746f7240c086bf0d4a0c089ba3bda9061081a0a08803524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08d0d2f1c206109283c2b8025a013112a6040a3173656976616c6f7065723130633672727a3535756b6b616637726a656572687078777071656c34746c6c7a73387667667112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203774bed4dacba87333c21ef3142f4b17433ae70f073cfc22531a8a6e3b6e693f20032a0f31343030323530343531323938393132213134303032353034353132393839313030303030303030303030303030303030303a95020a065a656c6c69631210363039433039313633364431333330421a1168747470733a2f2f7a656c6c69632e696f22127365637572697479407a656c6c69632e696f2ad10154686520676f2d746f20626c6f636b636861696e207365637572697479206669726d20666f7220746f70207465616d732c207370656369616c697a696e6720696e20436f736d6f732c2045564d2c205a4b2c204d6f766520284170746f7320616e6420537569292e20576520736f6c766520796f757220686172646573742073656375726974792070726f626c656d732e20547769747465723a2068747470733a2f2f747769747465722e636f6d2f7a656c6c69635f696f2054656c656772616d3a20742e6d652f7a656c6c69635f696f40fcf2c62f4a0b08a8adcab70610cd81973152490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b088783fdaf0610e2d0de345a013112f0020a3173656976616c6f7065723175786c66376d7672386e657033676d3775646632753972656d6d73326a796a7136656533356712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20fbede6aded1c15a36fe4f4a024a700ed0f881b2f0234c2506c9bac3d49ac6b5a20032a0f31333533323130363236313735363232213133353332313036323631373536323030303030303030303030303030303030303a6f0a044b696c6e1210394237343336344135453532364245441a1368747470733a2f2f7777772e6b696c6e2e666922107365637572697479406b696c6e2e66692a2e44656d6f637261746973696e672076616c7565206372656174696f6e20696e206469676974616c206173736574734a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120c08e1dbdac60610df93b4fc025a013112b5020a3173656976616c6f70657231783063393965386875656d68636a687565346e70386338303577396b386e6e767363636d666612430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2035298402ad4424ecb6187046d090f51ff999062a06952ee6f3dc9b0c5f307e2520032a0f31333238353730353930393030343632213133323835373035393039303034363030303030303030303030303030303030303a230a0c42696e616e6365204e6f64651a1368747470733a2f2f62696e616e63652e636f6d40db85a84b4a0c08e7bad7c40610c5c7aaa302524a0a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120c088ca4cfac0610fca5f2df015a0131128f020a3173656976616c6f7065723168666d6e79746766373374377434777a64617a656a787470776532746c61796c7735616d6c3312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20a6d0dd599cbcd8ed80de14ed3a00e6189fb0f9e4ae102d8a23b0ccd5bbb66ca420032a0f31323538323632333339303634373432213132353832363233333930363437343030303030303030303030303030303030303a0f0a0d666964656c697573206e6f64654a0052490a390a113530303030303030303030303030303030121135303030303030303030303030303030301a113130303030303030303030303030303030120c08ab91e1c70610b3def6f1015a013112e4020a3173656976616c6f706572317938326d3579337765766a6e65616d7a6730706d783837647a616e79787a6874306b6570766e12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203f730b9cc34dffbe86c108820c78a78b2361449dac30fbed2b19af4bc978332220032a0f31323432383839303030323439323532213132343238383930303032343932353030303030303030303030303030303030303a520a074669676d656e741210453546323734423837304244413031441a1268747470733a2f2f6669676d656e742e696f22137365637572697479406669676d656e742e696f2a0c4669676d656e7420496e632e40c09aa54b4a0b08808cd6c40610f0adc24f524b0a3b0a11353030303030303030303030303030303012123530303030303030303030303030303030301a12313030303030303030303030303030303030120c08e385efad0610a08ffbf3025a013112a6030a3173656976616c6f70657231686e6b6b716e7a776d79773635326d7568367766656137786c6667706c6e796a306b7534773412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20336ad457f0973109704512094ca1b0e7164217d80c0f5c6988e645e51c52277820032a0f31313631373436383433353134333832213131363137343638343335313433383030303030303030303030303030303030303aa9010a0c436f736d6f73746174696f6e1210414534433430334136453741413141431a1b68747470733a2f2f7777772e636f736d6f73746174696f6e2e696f221561646d696e407374616d7065722e6e6574776f726b2a53436f736d6f73746174696f6e2076616c696461746f72206e6f64652e2044656c656761746520796f757220746f6b656e7320616e64205374617274204561726e696e67205374616b696e6720526577617264734a0052450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12323030303030303030303030303030303030120608f086aea3065a013112fc030a3173656976616c6f7065723134306c36793267703367787661793671746e37307265377a327330676e35377a6c366e75707312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2053ec1510c9a5419a50eb0203b15498487aab6fde80f54a0ecebf8672a1c1233c20032a0f31303833363737343337373235303832213130383336373734333737323530383030303030303030303030303030303030303aef010a19204c6176656e6465722e46697665204e6f64657320f09f909d1210463837414444423730304330434339341a1d68747470733a2f2f7777772e6c6176656e646572666976652e636f6d2f221668656c6c6f406c6176656e646572666976652e636f6d2a88013130302520736f667420736c6173682070726f7465637465642e2057652073747269766520746f206d616b652074686520636f736d6f732061206d6f726520686f6c6973746963616c6c792077686f6c65736f6d6520706c6163652e20436f6d6520736179204869212068747470733a2f2f6c696e6b74722e65652f6c6176656e6465726669766540e585d90a4a0c08c99bb4a80610fef3afb80152440a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120608f086aea3065a013112ed030a3173656976616c6f706572316d6d357036616b3277393463777279306e34327078337373616a677974786e7766766434773812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20986112d4dfadd3269157ccf8578ebcbb26d52de786f15106c3fabf7c9b6c8afe20032a0f31303036363936353333313933333032213130303636393635333331393333303030303030303030303030303030303030303aeb010a0843726f736e6573741210354631443641433745413538383637361a1668747470733a2f2f63726f732d6e6573742e636f6d2f2219636861696e6d61737465724063726f732d6e6573742e636f6d2a99015765206f7065726174652073656375726520616e6420726564756e64616e742076616c696461746f7220696e66726173747275637475726520666f7220506f5320626c6f636b636861696e7320616e64206163746976656c7920706172746963697061746520696e204942432072656c6179696e672077697468206f76657220243335304d20546f74616c2052656c617965642056616c75654a00524a0a3a0a11353030303030303030303030303030303012123135303030303030303030303030303030301a113130303030303030303030303030303030120c08a5b0f3a60610e5a697ac025a013112e2020a3173656976616c6f706572316670766a7965347263716d6473367676726a766634706c386a66737635766b6e306c6c61787312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2061b09f375d43cb51a4b758ce49683e594517b68022b12c0835bb8970f5235fa320032a0e3738393435333338373231333832322037383934353333383732313338323030303030303030303030303030303030303a620a085374696e675261791210443141383139334146333930354141431a2168747470733a2f2f6769746875622e636f6d2f4d696b6861696c526164757368612a2152656c6961626c652050726f6f662d6f662d5374616b652056616c696461746f724a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08c1a3f3a606108cbbe29a035a013112de020a3173656976616c6f706572316761727a346b6a666761723864777970617975666361326d756a677466786c76366b7465303312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a207bd5a408389d58a0d1a853a6e522a27f80a5d8d4cdd9dde994747eeb248ffa9b20032a0e3734313531373335363635383230322037343135313733353636353832303030303030303030303030303030303030303a4d0a094d616e7469436f72651210443543464131313441314545314343371a1668747470733a2f2f6d616e7469636f72652e7465616d2216636f6e74616374406d616e7469636f72652e7465616d40bc8db6014a0c088baae6a40610bad1c28c01524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c08eef2f3a60610d5a8dca9025a013112b8030a3173656976616c6f706572316435306b6779646d30327867396b706166613865336a777a38336330757661676b78396d356e12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a200941ca8c1ee67af663b8d11e243203e44d2cefa277ddfd771fc82bac6181bd1520032a0e3635353438363339363238343334322036353534383633393632383433343030303030303030303030303030303030303ab9010a0a4e6f6465732e477572751210323842363732464345364242443536321a1868747470733a2f2f7374616b652e6e6f6465732e6775727522137365637572697479406e6f6465732e677572752a6a47757275206f66206e6f6e2d637573746f6469616c207374616b696e672e2050726f66657373696f6e616c206e6f64652072756e6e696e672c206c6f7720666565732c206265737420757074696d6520616e642032342f3720637573746f6d657220737570706f72742e4a0052490a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113530303030303030303030303030303030120b08a580f3a60610fe82ab7e5a013112a6030a3173656976616c6f70657231376761396a6861343567753078303479726d66706a706b736d716534387775707a6b356a657812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b55d8f5835da4285e662b55293d0bb414816f31a0c49262548572c71a010015820032a0e3539353033343531333132373237322035393530333435313331323732373030303030303030303030303030303030303aa6010a0c416374697665204e6f6465731210413245413744453736414435374531411a1a68747470733a2f2f7777772e6163746976656e6f6465732e696f2a68576520536b79726f636b657420796f7572205374616b652120486967686c7920417661696c61626c6520456e746572707269736520496e6672617374727563747572652077697468206d756c7469706c65206e6f6465732061726f756e642074686520776f726c644a00524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113530303030303030303030303030303030120c08d791f3a606109ecbf6e9025a013112a5030a3173656976616c6f70657231743966713371666d376e67617535677238716766356470667a6a716737396b6636356375303412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20edbe728c97279911d642f9afb38678b70dbb6bed279d1fd07a909b1bc5ced9f820032a0e3536313934363233323931363137322035363139343632333239313631373030303030303030303030303030303030303aaa010a0c496d70657261746f722e636f1210303837384241364245353536433133321a1568747470733a2f2f696d70657261746f722e636f2f2214636f6e7461637440696d70657261746f722e636f2a5b3130302520726566756e64206f6e20646f776e74696d6520736c617368696e67202d2d2050726f66657373696f6e616c2044656c6567617465642050726f6f662d6f662d5374616b65204e6574776f726b2056616c696461746f724a0052450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120608f086aea3065a013112ad040a3173656976616c6f7065723173706733333471647378746d6c7a716e3976736835363634373777643068723536636a73706a12430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a202337039468f1e257f7be2b855fbdb72c24a5042c01d2d7f12e5a671dfafef08020032a0e3535373933313638313036333434322035353739333136383130363334343030303030303030303030303030303030303ab3020a0b4369746164656c2e6f6e651210454242303345423442423443464341371a1368747470733a2f2f6369746164656c2e6f6e6522126e696b697461406369746164656c2e6f6e652ae8014369746164656c2e6f6e652069732061206d756c74692d6173736574206e6f6e2d637573746f6469616c207374616b696e6720706c6174666f726d2074686174206c65747320616e796f6e65206265636f6d6520612070617274206f6620646563656e7472616c697a656420696e66726173747275637475726520616e64206561726e207061737369766520696e636f6d652e205374616b652077697468206f7572206e6f646573206f7220616e79206f746865722076616c696461746f72206163726f7373206d756c7469706c65206e6574776f726b7320696e20612066657720636c69636b734a0052440a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113330303030303030303030303030303030120608f086aea3065a013112dd030a3173656976616c6f7065723134753338636c366b6e717873367673376c6a37767a6676617034327979633372756e7472776312430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20ad569a6bc7ecd79b7b336198e3ad9c13dd30e678ebfa33f6e6622efcd46e869c20032a0e3535343630323734343738363839322035353436303237343437383638393030303030303030303030303030303030303acc010a0e426c6f636b73636f70652e6e65741210413938463335433133383137314139391a1668747470733a2f2f626c6f636b73636f70652e6e65742219626c6f636b73636f70654070726f746f6e6d61696c2e636f6d2a75457870657269656e636564207465616d206f6620495420656e67696e65657273206275696c64696e6720644170707320616e6420696e6672617374727563747572657320666f7220626c6f636b636861696e2070726f6a65637473206c696b65204e6561722c20536f6c616e6120616e642053756940fad9e1464a0c08f1c6a6c20610f3bf90e001524a0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120b08ecb2f7a60610cfb58f0a5a013112b8030a3173656976616c6f706572317a76397a32777174333438646878716e3338787638647673753738636c65347873326364663412430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20b4913e63bbf7663c57563c53d066cd3fb20f5be24571e1dc4a9afb7902b201b120032a0e3535343233313933333831353433322035353432333139333338313534333030303030303030303030303030303030303ab7010a06456e69676d611210363232333639374143413234413446461a1d68747470733a2f2f656e69676d612d76616c696461746f722e636f6d2f221c636f6e7461637440656e69676d612d76616c696461746f722e636f6d2a5e50726f6f66206f66205374616b652056616c696461746f72206f6e20646966666572656e742070726f6a65637473202d2d2050617373696f6e6174652061626f7574204461746120536369656e636520616e6420546563686e6f6c6f67794a00524b0a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120c0887dff5a606109aa7ecc0035a013112fc010a3173656976616c6f7065723168367464786d6d706572616d646e6737716c307064687367716836613268776b78717466796712430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a203e2ac177d0205ee4fd937e8b35a6135c7eac959c063a21423f5f91fae13b07b920032a0e3436323433393531373835303832322034363234333935313738353038323030303030303030303030303030303030303a0b0a097a687374616b696e674a00523c0a2d0a13313030303030303030303030303030303030301213313030303030303030303030303030303030301a0130120b08c5e6f4bd06108caddc685a013112a1020a3173656976616c6f70657231676e6d6d67366d6363336e66323575723861353579796a6d356639356b3267777a736c32703812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20129f3d8c5891810a459e1ebd2aa2065f68386bbaab171f595f9560bd3b7a04bf20032a0e3433373831333936353339303435322034333738313339363533393034353030303030303030303030303030303030303a100a0e6f6273637572617374616b696e674082f5bc4e4a0c08e48ea2c60610e2c2d4a302524b0a3b0a1135303030303030303030303030303030301213313030303030303030303030303030303030301a113130303030303030303030303030303030120c0888f28ab90610cdb3b4d9015a013112b7030a3173656976616c6f7065723163746e6c6538616e6a7672736637683263647765777761333737783633656333756b6665366812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2093cfb8ef297202cc6a368739569d0e946d3b92a8b30744e0ec254a8582e95a9020032a0e3433373534363831313533323336322034333735343638313135333233363030303030303030303030303030303030303aa6010a094b7564617361694a501a0d6b7564617361692e636f2e6a70221b76616c696461746f722d646576406b7564617361692e636f2e6a702a6d4c61726765737420636f6d6d756e6974792076616c696461746f7220696e204a6170616e206f66666572696e672076616c69646174696e672c20656475636174696f6e20616e642070656e6574726174696f6e20696e746f20746865204a6170616e657365206d61726b65742e4080e690194a0c08c58899ae0610a9e7deee01524a0a3b0a11353030303030303030303030303030303012123235303030303030303030303030303030301a12313030303030303030303030303030303030120b08d9c995ad0610e0efec435a013112e5040a3173656976616c6f706572316d6565366b7973787a7039396b6676676b376e7178376c7271673874786d77376b617039677912430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a208d6e39491ee977ba5665e8c3c8ae000ec9d4a43f47960e89807b8178d420e50c20032a0e3432313931313936323334333236322034323139313139363233343332363030303030303030303030303030303030303ae6020a11206b6a6e6f6465732e636f6d20f09fa6841210314335414344324545463336334333411a2868747470733a2f2f73657276696365732e6b6a6e6f6465732e636f6d2f6d61696e6e65742f7365692a9402547275737465642050726f6f66206f66205374616b652076616c696461746f72206163726f737320436f736d6f7320756e6976657273652e204163746976652065636f73797374656d20636f6e7472696275746f722c204942432072656c6179657220616e6420636861696e20736572766963652070726f76696465722073696e636520323032312e2057652064656c6976657220746f702d6e6f7463682073656375726520616e642072656c6961626c6520696e66726173747275637475726520666f7220436f736d6f732070726f6a656374732e2032342f37206d6f6e69746f72696e672077697468206e6f20736c617368696e6720686973746f727920696e206f757220747261636b207265636f72642e4a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08aaaa9ba90610e486e44d5a013112ed020a3173656976616c6f70657231786832676639677976756d6c677072397773356e34323576686e74763972797377396772347112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2038e954f0c93e481acb3c4ebedcb79b9533a7c76043e4295e390e78f4a48eb3ec20032a0e3430363136303933343630343231322034303631363039333436303432313030303030303030303030303030303030303a620a0c5374616b696e67436162696e1210433035323244463939324230433430371a1868747470733a2f2f7374616b696e67636162696e2e636f6d221872696368617264407374616b696e67636162696e2e636f6d2a0c5374616b696e67436162696e409595d70a4a0c08d9c3b3a8061098b69ada0352450a3b0a11353030303030303030303030303030303012123230303030303030303030303030303030301a12313030303030303030303030303030303030120608f086aea3065a013112be030a3173656976616c6f70657231796b6c7336646868326d6a716b397830643365653239383733737466377777766564636a6d6812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2027e373c7f48b0dffedbda2b45e88190dd370dc6812f1ebaf88362b2bd6f89d7020032a0e3339343731333133343639383833322033393437313331333436393838333030303030303030303030303030303030303ab3010a0e436f696e616765207820444149431210433932433639363544383946303741331a1468747470733a2f2f646169632e6361706974616c22136f666669636540646169632e6361706974616c2a64546865206f6666696369616c2076616c696461746f72206e6f64652066726f6d20436f696e6167652028436f696e6167652e4d65646961292072756e2062792044414943202868747470733a2f2f646169632e6361706974616c2f74656c656772616d294080f78d264a0c08c8a1d5b3061080bcd2c70352440a3a0a11353030303030303030303030303030303012123130303030303030303030303030303030301a113130303030303030303030303030303030120608f086aea3065a013112db040a3173656976616c6f70657231347473306a3432716b70723433613374677872377a7a366c367a646637686465336d6632616512430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a2014c347b841def41b11c0ad46b781b1836fe1a354d3b7e66eb75f9722fa565ee720032a0e3338373137333736303031353839322033383731373337363030313538393030303030303030303030303030303030303acc020a034f62691210443534304430323334423341453142381a1168747470733a2f2f6f62692e6d6f6e657922244368656d6963616c42726f7356616c696461746f724070726f746f6e6d61696c2e636f6d2af9014f62692070726f766964657320636f6e76656e69656e742075736572206163636f756e7420736f6c7574696f6e7320666f722077616c6c6574732c2070726f746f636f6c7320616e64206170706c69636174696f6e732e20496620796f7527726520696e746572657374656420696e206f66666572696e6720736565646c657373206f6e626f617264696e672c206163636f756e74207265636f766572792c20617373657420696e6865726974616e63652c2073657373696f6e206b6579207369676e696e67206f7220737562736372697074696f6e7320746f20796f757220757365727320636865636b206f7574206f62692e6d6f6e657940bf95b10a4a0b08a7b1a5a806109096833d52490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08e590f9a60610e9e0c5355a013112f6020a3173656976616c6f70657231716538757566357836396335323668346e7a787776346c7466747237337637716e6b79706c6112430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a206c90f00323c0de18c521026359f0f52b69c466ae2bfb83e16049a80e55c57b2320032a0e3138383436383938333637333231322031383834363839383336373332313030303030303030303030303030303030303a780a095374616b656369746f1210443136453236453543383135344531371a1968747470733a2f2f7777772e7374616b656369746f2e636f6d22157365637572697479407374616b656369746f2e64652a275365637572696e67202620446563656e7472616c697a696e6720506f53204e6574776f726b732e4a0052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113230303030303030303030303030303030120b08ecf9bca30610afd892635a01311297020a3173656976616c6f7065723165717535337a396d356d6b7a6d3565706d7670337176687a373730646a79677963687567327612430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a201fa48908c73ba7f06f319c3c6501171c1eddc548cdc9917b2d990f6896a57c9620032a0e3135303030303032303034353435322031353030303030323030343534353030303030303030303030303030303030303a090a074248204e6f646540c7d8e0554a0b08c781ebc90610978abd3052490a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113130303030303030303030303030303030120b08c4b0f8c80610a6e4fb365a013112c9030a3173656976616c6f70657231716d70786c7377776b3432777961363774377a7361617766337675723033637565767373306812430a1d2f636f736d6f732e63727970746f2e656432353531392e5075624b657912220a20640f6ee2e5e582fe9efdfdbce26a2239d68e35798d4189b29d1437e99c323a0e20032a0e3130333138363437353630393639322031303331383634373536303936393030303030303030303030303030303030303ab8010a0c5032502e6f726720f09f92991210434235433037463744363435383430331a0f68747470733a2f2f7032702e6f72672217636f736d6f732d7365637572697479407032702e6f72672a6c5032502e6f7267202d2061206c656164696e6720696e737469747574696f6e616c207374616b696e672070726f76696465722e205374616b65207769746820757320666f722061207365637572652c2072656c6961626c6520616e642073696d706c6520736572766963652e40efb397564a0c088ea486ca061085b7f1e002524a0a3a0a11353030303030303030303030303030303012123230303030303030303030303030303030301a113235303030303030303030303030303030120c08f3a3f2c70610839c84ab015a0131" + }, + "has": [ + "1114787f6b6d9ea782923480c17d03f84802cf560c9a", + "11148d02754dbcb739916788ee56633e12916d372039", + "1114abffa229018a0cce93405cfcf1e7c2541e89d3c2", + "1114bced604c4ed91daa2b7cbe9c9cf7c6fa501fcc92", + "1114c81136fb247de77e9c634f2d21c3aee7ef3ebc5d", + "1114e1be9f6d833cf218a37ee352ae1479dee0a91240", + "111435cd3eb6383e81169d088138aacbc3792968e535", + "111448592266a3c036d8698c1c989a87e79260ca32d3", + "11145598f88b7f800c7306d67d1a7c95afa4bb3f69c6", + "11146d1f6411bb7a8c82d83d4f4f98c9c23c70fe33a8", + "111473921de199b8344034c9c62141b47ead011b6c8f", + "1114d87251b6de26392467c32cf125d736eed036e088", + "1114130a25380b8d4edb981389ccc3b590e78f8fe6a6", + "111444f7b46b78c4669553833f6942125ba24b4b290e", + "1114aae0f95540b04758f62b4187e10b5fd09a9f5db9", + "1114af227c7f56980d0d321efcbcc1259d0d54426223", + "1114ba77322d09f457e5d5c26f459919617654bff49f", + "1114be96d36f61c8fbb6cd1e07de16de0805f5d55dd6", + "1114c2e7fc9fb3930704faeac35d973bb1f78da8e711", + "1114c8394888bba6ec2dd321db031032e2f79ed91104", + "111406c26fc1ceb554e2775e5f850ef5c98b3837c71c", + "1114595208813bf4d1de510338109a342914808f16c9", + "1114a1909b17135d3469300ccae4c445df07e1f4cc09", + "1114d065447e409820fec8ddb630995f8fa1302094fe", + "1114dee81d76ca716b870c8f9d54134610ec90459a6e", + "11143ac2dcad4ab059071ba4cd9d3a506478e9dc1ab6", + "11146c7a35061d2e3b4a02b492220d263f5ec237cda0", + "1114f23a595fb5a238f33ea41ed21906d0d83353bb81", + "1114064fce2686d171456af5988ce657eb4ac7e8b3c0", + "111435d48495046737f4046574293aaa8cbcd6c28c90", + "111436de192e20837f8d72b3f26412600da5fc277fbe", + "111425bf0d36f756e40b14cf6c739514fe8c169f39cc", + "111433f052e4f7e6777c4afccd6613e0efa38b63ce6c", + "1114805118d40d8197bf88132b217a6b55f79cd7dc74", + "1114aeb6f397e03eec0769cfdeff730b4aaf90a5f6fd", + "1114de73ab1206104a5b2588b7a6037be3020eb36dde", + "1114e6f732543aad0c3e9b15dfa61ba7cc375c912e21", + "111421d5ba122ecb253cf76243c3b31fcd1766430aeb", + "11147e34318a94e5add4f872ce477099c1067f55ffe2", + "111447462ada49474676b881e9389c755be490b49bec" + ] + }, + "upgrade": { + "reads": { + "00": "", + "01362e322e30": "", + "0176352e352e32": "0000000004b755a9", + "0176352e352e35": "000000000501d47e", + "0176352e362e32": "0000000005554afe", + "0176352e372e35": "0000000005a1e7ff", + "0176352e382e30": "00000000061be5cf", + "0176362e302e30": "0000000006d9ef79", + "0176362e302e31": "00000000072454d6", + "0176362e302e33": "0000000007bf1e1d", + "0176362e302e35": "0000000008574216", + "0176362e302e36": "000000000908d442", + "0176362e312e30": "0000000009224206", + "0176362e312e34": "000000000997d62e", + "0176362e322e30": "000000000a6dcb7b" + }, + "has": [] + }, + "wasm": { + "reads": { + "0100000000000008c5": "0a206f3fb440bc9d90333e4bbf7b8e74a7e15683db1eb91337484649056314e57fa6122a736569317639646c6e6d66687a66766b3277796a3338663065337736353537786876376a7337713733362a020803", + "0270ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526": "08c511123e73656931686a737172666467326876776c336761636734666b7a6e75726633367573727637726b7a6b79683239777a336775757a656830736e736c7a37642211496e7374616e74696174652043573732312a0708dfda911a1001", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331303938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31303938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313137": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313137222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313137": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313137222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313838": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313838222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313931": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313931222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313934": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313934222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331313938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31313938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331323937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31323937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333730": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333730222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333833": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333833222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331333939": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31333939222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343439": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343439222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331343937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31343937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353039": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353039222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353439": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353439222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353833": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353833222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353934": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353934222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331353935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31353935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363931": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363931222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331363939": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31363939222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313730": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313730222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373039": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373039222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373333": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373333222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373931": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373931222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373934": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373934222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331373938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31373938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383238": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383238222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313833": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313833222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383533": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383533222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383934": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383934222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331383939": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31383939222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73313937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f313937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7331393938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f31393938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f32222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7332303030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f32303030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323039": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323039222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323137": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323137222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323333": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323333222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323439": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323439222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323533": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323533222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323730": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323730222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73323939": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f323939222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333238": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333238222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333637": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333637222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333833": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333833222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333838": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333838222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333931": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333931222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73333937": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f333937222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343238": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343238222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343331": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343331222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343632": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343632222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343838": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343838222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73343938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f343938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f35222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353030": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353030222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353036": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353036222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353039": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353039222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353333": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353333222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353338222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353439": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353439222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353535": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353535222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733537": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3537222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353838": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353838222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73353936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f353936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f36222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363139": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363139222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363235": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363235222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363431": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363431222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363434": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363434222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363637": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363637222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733637": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3637222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363931": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363931222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73363939": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f363939222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733730": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3730222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373133": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373133222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373136": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373136222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373233": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373233222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373330": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373330222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373430": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373430222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373432": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373432222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373733": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373733222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373830": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373830222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373833": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373833222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73373936": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f373936222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e7338": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f38222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383033": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383033222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383034": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383034222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383037": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383037222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383134": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383134222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383135": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383135222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383234": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383234222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383236": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383236222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383332": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383332222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383333": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383333222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383335": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383335222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383336": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383336222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383337": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383337222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733835": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3835222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383530": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383530222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383532": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383532222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383536": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383536222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383630": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383630222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383636": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383636222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383731": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383731222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383736": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383736222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383737": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383737222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383738": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383738222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383832": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383832222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383836": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383836222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383837": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383837222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733839": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3839222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73383935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f383935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393031": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393031222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393032": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393032222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393035": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393035222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393038": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393038222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393130": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393130222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393131": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393131222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393132": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393132222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393138": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393138222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393230": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393230222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393231": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393231222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393232": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393232222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393237": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393237222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393238": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393238222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393239": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393239222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393334": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393334222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393339": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393339222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e733934": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f3934222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393433": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393433222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393435": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393435222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393436": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393436222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393437": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393437222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393438": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393438222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393531": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393531222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393533": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393533222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393534": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393534222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393538": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393538222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393539": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393539222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393631": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393631222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393633": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393633222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393634": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393634222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393635": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393635222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393638": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393638222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393639": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393639222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393732": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393732222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393734": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393734222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393735": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393735222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393739": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393739222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393831": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393831222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393834": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393834222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393930": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393930222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393932": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393932222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393933": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393933222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393935": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393935222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5260006746f6b656e73393938": "7b226f776e6572223a22736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633222c22617070726f76616c73223a5b5d2c22746f6b656e5f757269223a2268747470733a2f2f617277656176652e6e65742f3938304142346d4b356e5061595a794951565773775a3133697a6c4d354d5a7742676e7a4b7069614633512f393938222c22657874656e73696f6e223a7b22696d616765223a6e756c6c2c22696d6167655f64617461223a6e756c6c2c2265787465726e616c5f75726c223a6e756c6c2c226465736372697074696f6e223a6e756c6c2c226e616d65223a6e756c6c2c2261747472696275746573223a6e756c6c2c226261636b67726f756e645f636f6c6f72223a6e756c6c2c22616e696d6174696f6e5f75726c223a6e756c6c2c22796f75747562655f75726c223a6e756c6c2c22726f79616c74795f70657263656e74616765223a352c22726f79616c74795f7061796d656e745f61646472657373223a22736569316432393572666b37767234757235673572743278753270776b337a7866667673713873386733227d7d", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303031": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303032": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313031": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303130": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303131": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303232": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303233": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303234": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313033": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303331": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303336": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303338": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313034": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303431": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303432": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303434": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303437": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313035": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303531": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303535": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303536": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303538": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303539": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303630": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303636": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303739": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303831": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303836": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303935": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313035": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313038": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313137": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313232": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313237": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313133": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313334": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313336": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313339": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313134": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313431": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313433": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313434": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313436": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313438": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313135": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313530": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313536": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313136": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313630": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313631": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313635": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313636": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313137": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313731": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313732": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313733": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313138": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313838": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313931": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313934": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313935": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333132": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323031": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323035": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323036": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323132": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323138": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323139": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323332": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323336": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323431": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323530": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323532": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323535": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323536": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313236": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323630": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323631": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323732": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323733": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323735": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323739": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323932": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323933": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323935": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313330": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333032": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333034": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333036": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333037": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313331": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333130": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333136": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333139": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333236": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333335": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333336": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333338": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313334": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333432": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333433": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333436": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333437": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333438": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333537": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333730": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333732": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333734": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333735": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333739": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313338": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333832": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333833": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333836": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333839": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333930": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333939": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313430": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343031": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343032": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343036": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343038": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343130": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343132": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343133": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343138": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343232": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343233": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343234": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343239": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343332": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343334": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343335": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313434": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343431": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343434": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343435": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343437": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343439": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313435": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343530": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343532": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343536": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343538": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343539": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343630": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343631": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343635": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343639": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313437": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343732": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343739": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313438": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343836": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343839": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343930": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313530": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353036": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353037": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353039": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353131": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353132": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353133": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353136": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353139": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353233": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353237": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353239": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353335": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313534": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353432": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353433": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353439": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353530": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353531": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353532": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353635": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353638": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313537": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353731": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353733": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353735": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353832": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353833": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353834": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353835": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353839": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353934": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353935": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363031": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363034": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363035": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363038": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363131": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363133": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363136": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313632": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363236": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363330": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363331": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363334": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363335": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363431": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363434": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363435": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363438": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363537": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363538": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363632": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363635": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363636": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363639": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363731": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363831": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363836": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363839": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313639": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363930": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363931": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363932": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363939": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313730": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373032": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373036": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373039": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313731": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373131": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373136": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373139": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313732": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373234": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373236": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373237": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373330": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373332": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373333": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373334": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373338": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373432": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373435": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373436": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313735": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373535": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373537": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373539": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373631": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373638": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373734": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373735": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373831": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373834": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373930": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373931": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373934": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383037": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383038": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313831": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383139": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383230": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383231": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383233": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383237": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383238": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383239": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313833": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383331": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383332": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383336": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383337": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383339": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383430": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383436": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383532": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383533": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383537": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313836": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383630": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383631": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383632": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383636": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383734": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383735": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383736": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383737": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383739": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383832": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383837": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383930": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383932": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383933": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383934": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383936": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383937": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383939": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393032": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393033": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393035": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393038": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393132": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393134": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393135": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393136": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393138": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393234": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393235": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393236": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393330": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393334": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393335": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393339": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393435": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393531": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393532": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393534": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393536": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393632": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393633": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393634": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393636": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393638": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393639": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313937": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393733": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393738": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393830": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393831": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393834": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393835": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393836": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393839": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393938": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763332": "31", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763332303030": "34", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323033": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323036": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323037": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323038": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323039": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323132": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323137": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323231": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323234": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323236": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323237": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323333": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323334": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323435": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323439": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323531": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323533": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323535": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323537": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323538": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333236": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323630": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323632": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323638": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323730": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323731": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323733": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323736": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323738": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323830": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323832": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323835": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323836": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323837": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323933": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323935": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323938": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323939": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333330": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333034": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333038": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333331": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333133": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333134": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333135": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333138": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333139": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333332": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333231": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333232": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333234": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333235": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333238": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333332": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333431": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333335": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333531": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333532": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333336": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333634": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333637": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333732": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333733": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333734": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333737": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333739": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333338": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333830": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333831": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333833": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333835": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333838": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333839": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333339": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333931": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333937": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343030": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343033": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333431": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343130": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343131": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343134": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343139": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333432": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343230": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343233": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343234": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343238": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343239": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343330": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343331": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333434": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343431": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343434": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343437": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333435": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343535": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343631": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343632": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343634": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343731": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343733": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343735": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343737": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343739": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343837": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343838": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343839": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343932": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343933": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343938": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763335": "31", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333530": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353030": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353034": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353036": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353039": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333531": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353130": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353132": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353133": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353135": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353139": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333532": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353232": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353239": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353333": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353334": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353338": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333534": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353432": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353435": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353437": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353438": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353439": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353530": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353534": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353535": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353538": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333536": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333537": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353731": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353732": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353735": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353830": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353834": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353836": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353838": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353839": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333539": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353932": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353933": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763336": "31", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333630": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363031": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363037": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363130": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363131": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363134": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363139": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363232": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363235": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363239": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333633": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363330": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363334": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363336": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333634": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363430": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363431": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363434": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363530": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363531": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363534": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333636": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363630": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363631": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363634": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363637": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363638": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333637": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363734": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363736": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363739": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333638": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363832": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363835": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363931": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363935": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363939": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333730": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373031": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373033": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373035": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373132": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373133": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373135": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373136": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373138": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373230": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373233": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373234": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373239": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333733": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373330": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373332": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373337": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373430": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373432": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373438": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333735": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373534": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373634": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373639": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373733": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373735": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333738": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373830": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373833": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373834": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373835": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333739": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373932": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373933": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373936": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763338": "31", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383033": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383034": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383035": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383037": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383038": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383131": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383134": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383135": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333832": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383234": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383236": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383237": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383332": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383333": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383335": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383336": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383337": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383437": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333835": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383530": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383531": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383532": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383536": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383538": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383630": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383636": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383731": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383732": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383734": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383736": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383737": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383738": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383739": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383832": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383834": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383836": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383837": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383839": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333839": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383935": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333930": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393031": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393032": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393035": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393038": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393130": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393131": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393132": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393138": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393230": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393231": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393232": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393237": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393238": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393239": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393334": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393339": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333934": "32", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393433": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393435": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393436": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393437": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393438": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393531": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393533": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393534": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393538": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393539": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393631": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393633": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393634": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393635": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393638": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393639": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393732": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393734": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393735": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393739": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393831": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393834": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393930": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393932": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393933": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393935": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393938": "33", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a5266c69676874686f7573655f696e666f": "7b2266726f7a656e223a66616c73652c2268696464656e5f6d65746164617461223a66616c73652c22706c616365686f6c6465725f746f6b656e5f757269223a6e756c6c7d" + }, + "has": [ + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323533", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353934", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333730", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323939", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393533", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323137", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353039", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353833", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333931", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363939", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333637", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333833", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373039", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383934", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363939", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383939", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343439", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353439", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323439", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383333", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353039", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333934", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333939", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333838", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343238", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363639", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383238", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763332303030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313137", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343130", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373934", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313931", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313833", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323535", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353838", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373931", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323730", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343239", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323333", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333730", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333636", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373234", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313934", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323039", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353333", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353439", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313838", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343735", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363931", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333537", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373835", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303337", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313135", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373333", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353538", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313134", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383633", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373032", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383034", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313534", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333238", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363935", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373433", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393238", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363334", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353030", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343836", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373936", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313435", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333833", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373833", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333839", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353133", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363632", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353635", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363631", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313437", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363931", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313730", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313738", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343031", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353235", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323634", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333431", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353733", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373330", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383533", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323933", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333531", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363734", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763332", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353232", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373233", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363438", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383739", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343838", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333536", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313737", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393938", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303432", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313237", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373837", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331313530", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373231", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373236", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343932", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313033", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331353834", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393132", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363637", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333637", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383336", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303430", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331383038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323038", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333339", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633343539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303131", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323630", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331343434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333338", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633373539", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333832", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393035", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633313137", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323036", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331323732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303230", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363731", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363831", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393638", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363136", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331373930", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393436", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303331", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331333335", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331363830", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633333937", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633363434", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383037", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633383732", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331303736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e78763331393138", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633323736", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633353139", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e7876333532", + "0370ae30046909ba8b0cc22a601dcc6bc3d20e42d4468930e458ff9f482410a526000d746f6b656e735f5f6f776e6572002a736569317034367a347836647765687a326d63763068326d6836706a7864757a303034686e396e787633393138" + ] + } + } + }, + "tendermint": { + "traces": [ + { + "endpoint": "Block", + "arguments": [ + "187688144" + ], + "response": { + "block_id": { + "hash": "ED809DF930894FB505167E8233E5CF74E81E76FF633683CC28B0E23898F75B6B", + "parts": { + "total": 1, + "hash": "C2AB699A4C01616340F39700D9F1BE44AFAB3D78EFC5B8AB818DA97CF334AC58" + } + }, + "block": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "pacific-1", + "height": "187688144", + "time": "2026-01-05T18:48:49.705096943Z", + "last_block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "last_commit_hash": "DECC5A41EC72A0EBB3CA880926AB672CD3B06BA3B38B18518A32C613EB3CF9BF", + "data_hash": "C813F5CD33CE639D3E1DACA248608C25D330E93889992E3D50A0F55BFED58DAD", + "validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "next_validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "consensus_hash": "7D0B88F8835DB6E92EC4E959CCD9324052C68794BC42567CFA45FB176ED6679A", + "app_hash": "B7818515F77D243F2FF2ED3E3060E6DEA773B65DFFDB860C4339BCD2DD27A06B", + "last_results_hash": "F2BA124D271707704573A4AA42922BEEBD172671473304B29E319CB78AAC7F8E", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "399548FF09159AF3711DF1EF08CC243C505130B6" + }, + "data": { + "txs": [ + "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" + ] + }, + "evidence": [], + "last_commit": { + "height": "187688143", + "round": 0, + "block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "6CA80EE04179FF609B07F9BBC65C6E47F20D09CA", + "timestamp": "2026-01-05T18:48:49.39828782Z", + "signature": "/sbaRht20zHw58u2RiL8m3gdw/d4IV1QyuP/xN6faPqgn7SE0w+zR8DtA0alnmflf13uLGBUFvwZ8e5tYyzTAA==" + }, + { + "block_id_flag": 2, + "validator_address": "399548FF09159AF3711DF1EF08CC243C505130B6", + "timestamp": "2026-01-05T18:48:49.416880259Z", + "signature": "oQT4nFIYs/NRfunUHQgl+FxrBP7tr0UYI5fl/JGqbkGFcfQlmMZpeJjsLQOU2++sHKeCrN4pJfrOLO5xRbNSDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "7482D68A8C68FD7204273223D90864207B1558B5", + "timestamp": "2026-01-05T18:48:49.419379126Z", + "signature": "h4CrFlNrE7ra7xnsXeuvtT29MKFcy1peJAL6QyzN0HldLpFNQ/YhsC8oZnxM39AIBl8jSVjB3Vo17QPNih8nDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F04B5B9C48B65604A1309E0B0046B4F7CF8C7EF2", + "timestamp": "2026-01-05T18:48:49.440178566Z", + "signature": "DXfosmGYtLL344vUv2zpuqh9oeQCwCvMIBy3OwiFJ8FvPeLDu+OZyQ+9YvX5tMRUAiDpY/Q46+a2iUxSYZI1BA==" + }, + { + "block_id_flag": 2, + "validator_address": "9F1F7B9B3584198F985ADB6AA72037731D2A3C73", + "timestamp": "2026-01-05T18:48:49.421256307Z", + "signature": "cyFy+78m9IoZYy2/HL52s89u/xpFWtlsC0k7jTRZbbxgJyONNE52CTjwolVGqgRvEIVKa1GGk+3WxF4EsJnFDw==" + }, + { + "block_id_flag": 2, + "validator_address": "3D4CEB152CA0271E5A9AF577D67C828A228C87DF", + "timestamp": "2026-01-05T18:48:49.436823294Z", + "signature": "QidGl3TfF1Eu32mTVGp5j3I6/IUdjr43mrY6QXOpcr/a8vM1MB22sbg6MBp+KjHVv9RFRwRO0soUM8uD/ZOJBg==" + }, + { + "block_id_flag": 2, + "validator_address": "59E78E0B1133144460575337FAA2558399E43661", + "timestamp": "2026-01-05T18:48:49.409518086Z", + "signature": "7nOgmfV+r+C7Lt5MHS0eNuCia1Bn5aaz7ZOwDOdfMw01fl3VEGK6vUMgM36CHtYcONZhp/rxGUKMPxPfTOBQAA==" + }, + { + "block_id_flag": 2, + "validator_address": "AA5241DBD04ED2D969216D30C14D408CE3356919", + "timestamp": "2026-01-05T18:48:49.445319702Z", + "signature": "aBokEyZw7Q+nozzecIxwKIrXP1AfxKfcCBtbSMNueDPkgSGENJexX6VMIxEzEQ1IjFELyJk4MLvMVt8cDDyQAg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC60893A39B4E2DB10EC336489C71F2B537A7C65", + "timestamp": "2026-01-05T18:48:49.391370456Z", + "signature": "ilK3eLwRXsonQ1OM+AZGfsjv8MCCujpCDdeZlqp1kzyo3VrPZmX1Oijprl1UcatG7IV2Fablkhhzn5zC9BIvBA==" + }, + { + "block_id_flag": 2, + "validator_address": "B1E0490AAC5CD08248C284378296D86810410591", + "timestamp": "2026-01-05T18:48:49.406078333Z", + "signature": "loji0DQL9Y+mtqagR5410tsD319laBY7O1twrgRw9X/rqcLIeMC47ZtLKFoUVZ9mxq818q5VmpdYemAlisRSDw==" + }, + { + "block_id_flag": 2, + "validator_address": "00D66A1CB50A2473D8F011D369ADB117A527072D", + "timestamp": "2026-01-05T18:48:49.401140543Z", + "signature": "PH4u4SlZWVPEE5k0VG300n4/M8LKb+J1GGHd8Iu7w+a+zn14e8BMRUL41zqOnzGXQSqWgtZO10v1zxngdMGzDw==" + }, + { + "block_id_flag": 2, + "validator_address": "0AB238961ABDBC7C99C6693765DB290420E2ED87", + "timestamp": "2026-01-05T18:48:49.418072293Z", + "signature": "Af4pxMwGyl76MO2B14F5uEQRuCi/Z3qsFkF5SqQhJ2iJGNjVETkapcxpNWta/PlB2HhvaJVkGTK35n0U0ISBBQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E1CA4BCEB36E12283CCAB4A844A97E0C050F005A", + "timestamp": "2026-01-05T18:48:49.418684131Z", + "signature": "7942zAB42jNUzcoXlgs+dhtB3n7WwwFNq7sFrAieUc5J/Ad8u0cjbXpKm0Omrg5UGhaKllg7Okykf9ZRrcF5Ag==" + }, + { + "block_id_flag": 2, + "validator_address": "6E900C94F99B249CD8FB6538969E0D9E099C2F52", + "timestamp": "2026-01-05T18:48:49.416314883Z", + "signature": "rRZqZdCeKFdRhr8VLntaULl1ODxk261WtHFCfcL7/WcfHfu7yUeEYkckRgKQnJgjVizCIBryhD15hkLZpSotBg==" + }, + { + "block_id_flag": 2, + "validator_address": "B016593FC42B4A1988404F3D80AFEF984BD966E2", + "timestamp": "2026-01-05T18:48:49.402207338Z", + "signature": "JrwZ0ux9PeOOscstIbLXtKDznod8yfCJ8I3aXhOJxCfjbDoZOMcHEp82OWylhTifDZJ6df1rZ6bqHhNedotHDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "1394B86452A60711A0D3637E327D7D080A459B76", + "timestamp": "2026-01-05T18:48:49.404573449Z", + "signature": "PGMoQvhT9kLj/M3u74Qzo0RVAzQ6xZy4wgJFg7N7lEdYo+MDZBBicNy7GY/OKqKMeXX/TqQoJGaBQ4uZtFs1Aw==" + }, + { + "block_id_flag": 2, + "validator_address": "AB873FF0A3F0BD6D36712004C61CE8BF5970EB60", + "timestamp": "2026-01-05T18:48:49.431377562Z", + "signature": "+0xQ1vFGsyOZdBELIn2+40lwQ4l84PueY82v5vyHNBtc9M2BAb4GtjqEN+e5yPSIHRQ32DzULjcgdwpD5rilBw==" + }, + { + "block_id_flag": 2, + "validator_address": "314E76481BDEA52CEA72A30BC185B14F97E7E1D5", + "timestamp": "2026-01-05T18:48:49.413176691Z", + "signature": "4Qk07nO+z6AGvu619aabD4P3Kp/eJ6sFT17beV8iqymiKfDcE3LawSkocOR03nN+OYgI1vEY3XMSTBYiqlPHDg==" + }, + { + "block_id_flag": 2, + "validator_address": "BA479C5C63D95550191E3D6434BA557BD5F69508", + "timestamp": "2026-01-05T18:48:49.391503662Z", + "signature": "PuFZidvAPy3vWiAy35eqgzX39H2po6CWkhR5YCkCsD7cxSVF2NFJ7wW1un4mhvw3xLgVpbzpCA8zTBsVAiVLCg==" + }, + { + "block_id_flag": 2, + "validator_address": "40F909929F7FA9D475E2C6F5A94AC9D6D97CF83D", + "timestamp": "2026-01-05T18:48:49.40052186Z", + "signature": "diNLbodlI0wg96BpP2i27uO4y/YNGbSTb9PXLB+EU+S4550EnZRKpge5d1rl+hPUa43wV5MUBe0fdDE7dWU6CA==" + }, + { + "block_id_flag": 2, + "validator_address": "1AEFCC514E41F3DD21F5CE20B7BA3D142EB56256", + "timestamp": "2026-01-05T18:48:49.411004464Z", + "signature": "9N/Otx75V5qnsUoF4pqebNi4KPCFFnpIYodmZD6xcMqSZQmDisG2UZef0N7Kz2f/boluy/su/jobVJirhwc+Cw==" + }, + { + "block_id_flag": 2, + "validator_address": "114C0350B9CE023F98518D9F22A2E2E7548DAF66", + "timestamp": "2026-01-05T18:48:49.432133119Z", + "signature": "wcc7kubtws5Hb3FOdr99XROKhUWCRcdtb98kKJ4+sPEsSlTeI1DAB6P7izdNhTKjaN/gbvWltoi9WO5d9ZgrCA==" + }, + { + "block_id_flag": 2, + "validator_address": "CCC61D60E3DD1121BBBB2EA4C0039F91FD372389", + "timestamp": "2026-01-05T18:48:49.401195263Z", + "signature": "V9tVQcnV4vhJyhKYE6B1FMY6WJCFY3jXHrNDiloFhPcnfL/bT5wTdIweK0VIMkXN2N6r0LlXGIUJlZs2L0BhAA==" + }, + { + "block_id_flag": 2, + "validator_address": "25ABC30B5E07AFD6CA59EAA3495AC44D6B5C3026", + "timestamp": "2026-01-05T18:48:49.414351459Z", + "signature": "qorrktsulEY9CgnodGFGQ8Aa4bnFcxCBPp0F3jWoDuqRhKtLl2NKZSgPefIcMgn1iI4ebAeC4P20O7Bh+iz2DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "922357BD8E69E6119D0630F7ABBBF7C5E3879F2F", + "timestamp": "2026-01-05T18:48:49.433680826Z", + "signature": "oVBa91cRmYkwVMVYBXZEyNETXZUh4gtI5oVVWjMNb7j0hOAnjM7zCfueex9IlUi3AqEuPdFEgtufgNCBhOPSDA==" + }, + { + "block_id_flag": 2, + "validator_address": "A633A4EEB521DD9F09326BF5C945BC24327C6A66", + "timestamp": "2026-01-05T18:48:49.414773774Z", + "signature": "K1OFMypkH2mR60EQ+633ar9jCZrj46SVeGeATotvV8z4CIDBq/WPz4nXQo6AB+/InCfW1hjTtJGxDJBsUKxdAw==" + }, + { + "block_id_flag": 2, + "validator_address": "183388665BAC7D2537A91633FDC9ED5D6F46EF37", + "timestamp": "2026-01-05T18:48:49.429424419Z", + "signature": "7kdJ+3bizEtQXg6HXg7djAE6ecQAz3VHKuyEceQyqtz2/afYvUXwWgokygkfD3EH04c+Jwpl9M/hYUiFSZwRCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E557DD5ACE79FC5C741275673CB35719F9137DCB", + "timestamp": "2026-01-05T18:48:49.426887237Z", + "signature": "WbIqRay0Vhu/Tr48jir5XBCsGxdSCqee69hxQ3iXT39GzdUXxpTdd4EkmRCtnF4fRS/8CKyXsZu42WvzKAtDCg==" + }, + { + "block_id_flag": 2, + "validator_address": "E58F7A4F8E69795E1B0AFFF2A63C4555930F0CB1", + "timestamp": "2026-01-05T18:48:49.439710162Z", + "signature": "Qmu4+mPYdrM2F1F+xCz/Xtj9OYn3BYoorpKh18+Z0T80Zp38eg4ZyC1iemyyteNMlFX/n2xkVOLeZnsGGMpNCg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC7DC427A5EE1FEA25236DBD78AB8F66DB0AEC22", + "timestamp": "2026-01-05T18:48:49.412414886Z", + "signature": "AkkwCoUjC1P05Lxn9Wsz5twu44ZmuN28RaXaByBR0D48WfFyrFdJAb1slgWmMb9181Q6etul1duxhdr8yujXDg==" + }, + { + "block_id_flag": 2, + "validator_address": "40369FABDD947B4848FD7361B0B824A36CBF19A6", + "timestamp": "2026-01-05T18:48:49.420191652Z", + "signature": "i7B2mItd//aN7z9gz3nnoeUXTO5gdDnU3p8Yw2ixqfjYLq6KE0IxO/kK5V3CZ+rlFqO/JnI5QgHkzSfMMB+oDA==" + }, + { + "block_id_flag": 2, + "validator_address": "F40A639C3BE84EA224492A34B3C741DEC5F28444", + "timestamp": "2026-01-05T18:48:49.445735369Z", + "signature": "8j8c0BsMES1z37ChyRsP22yClG3qwaS1p48Pd5s4JfsTerzdUAWB4ISY893DXxH84wBOPrVCYkOGOnD9wH0sAw==" + }, + { + "block_id_flag": 2, + "validator_address": "8E4218ECD657CCD6FDE32C0FC0C4AC3366B71E5D", + "timestamp": "2026-01-05T18:48:49.403911864Z", + "signature": "temCJjI666aZwIh4qPJDB7Dh3WYm13So6KiHmypmwJsQmAJBfxKibCHrBrgehdc+N/WEz0DQZiBHw3AHc1GpDw==" + }, + { + "block_id_flag": 2, + "validator_address": "F0E0BFD3FEF2EC20DC7FFFA150BA9E9FECA55143", + "timestamp": "2026-01-05T18:48:49.394111876Z", + "signature": "XkKX+xVf+SmeouACTvSVrTj1JbQ4gYaClh/ywqlthj1HFZurp+YAMz02Jq03ZDWwgLZ9k+iiPyHHXBc4UBv3DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "8F7E88D0344F74BC17822506E7E29B220AD221DA", + "timestamp": "2026-01-05T18:48:49.426815066Z", + "signature": "zybIQBMYJHyV21a+gXdOc3e1BLKGuLpPbeSm+kwOsHTGylMK5rTcdY+4nqC0YXBXJn5jDsMgHChCLNgJ2m34CA==" + }, + { + "block_id_flag": 2, + "validator_address": "E06A77383534E7157F4BE3C873B25A62E7FF6428", + "timestamp": "2026-01-05T18:48:49.449723146Z", + "signature": "z8Cqe/XBzHtQw5oQ79Yi2R7S8fbLUtFjZYfLBEPniEAZUwi5rSb1LnXdcofDKgXnTnOpXZdFTm/U3uQot2COCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F878712942EE2566B849ADB75DA7993FD93AD71D", + "timestamp": "2026-01-05T18:48:49.445707809Z", + "signature": "2ugvX4rNlCaBIVkCPA+Vtz8RbY5Csp7yqBgMCLh/Hj7/XGnRgPjp8nxfkrBB7TNyz9swyye02d4xjtuXIYwJAA==" + }, + { + "block_id_flag": 2, + "validator_address": "507A1930FE00C2B4D3DAE52C7463DCDA2468A5ED", + "timestamp": "2026-01-05T18:48:49.412219661Z", + "signature": "Q6kvRQU/+ypYUVBD0mK2vzxGxPvC3wsUgMejrCGGaKYgMxYxJgXTHDDMr7vvfZN6LdG8dyHm/R7RCG1m1G9LDA==" + }, + { + "block_id_flag": 2, + "validator_address": "174071DA88C6E60CC74E5DA0DCBE80A7CF300B62", + "timestamp": "2026-01-05T18:48:49.415049646Z", + "signature": "qG/z34X+7DZLnhAbQb5b3E7YwW3epsYQtqwXWUcuq4EO/acO8tIvFIZKY5zkQzOnmxIFoWI7MYOfaVGwcvwUAA==" + }, + { + "block_id_flag": 2, + "validator_address": "59AB86020766FCDC61BB0139639D1646760F21D9", + "timestamp": "2026-01-05T18:48:49.412468053Z", + "signature": "eOTDi5RZIQClsMYAQGtsvSZW6yfFPvCUbqDTQhydS6Kl+Gj5nt2PBRjX51AitA4xikW0VDIVw/sZNaPZ5SLSDg==" + } + ] + } + } + } + }, + { + "endpoint": "BlockByHash", + "arguments": [ + "ED809DF930894FB505167E8233E5CF74E81E76FF633683CC28B0E23898F75B6B" + ], + "response": { + "block_id": { + "hash": "ED809DF930894FB505167E8233E5CF74E81E76FF633683CC28B0E23898F75B6B", + "parts": { + "total": 1, + "hash": "C2AB699A4C01616340F39700D9F1BE44AFAB3D78EFC5B8AB818DA97CF334AC58" + } + }, + "block": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "pacific-1", + "height": "187688144", + "time": "2026-01-05T18:48:49.705096943Z", + "last_block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "last_commit_hash": "DECC5A41EC72A0EBB3CA880926AB672CD3B06BA3B38B18518A32C613EB3CF9BF", + "data_hash": "C813F5CD33CE639D3E1DACA248608C25D330E93889992E3D50A0F55BFED58DAD", + "validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "next_validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "consensus_hash": "7D0B88F8835DB6E92EC4E959CCD9324052C68794BC42567CFA45FB176ED6679A", + "app_hash": "B7818515F77D243F2FF2ED3E3060E6DEA773B65DFFDB860C4339BCD2DD27A06B", + "last_results_hash": "F2BA124D271707704573A4AA42922BEEBD172671473304B29E319CB78AAC7F8E", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "399548FF09159AF3711DF1EF08CC243C505130B6" + }, + "data": { + "txs": [ + "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" + ] + }, + "evidence": [], + "last_commit": { + "height": "187688143", + "round": 0, + "block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "6CA80EE04179FF609B07F9BBC65C6E47F20D09CA", + "timestamp": "2026-01-05T18:48:49.39828782Z", + "signature": "/sbaRht20zHw58u2RiL8m3gdw/d4IV1QyuP/xN6faPqgn7SE0w+zR8DtA0alnmflf13uLGBUFvwZ8e5tYyzTAA==" + }, + { + "block_id_flag": 2, + "validator_address": "399548FF09159AF3711DF1EF08CC243C505130B6", + "timestamp": "2026-01-05T18:48:49.416880259Z", + "signature": "oQT4nFIYs/NRfunUHQgl+FxrBP7tr0UYI5fl/JGqbkGFcfQlmMZpeJjsLQOU2++sHKeCrN4pJfrOLO5xRbNSDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "7482D68A8C68FD7204273223D90864207B1558B5", + "timestamp": "2026-01-05T18:48:49.419379126Z", + "signature": "h4CrFlNrE7ra7xnsXeuvtT29MKFcy1peJAL6QyzN0HldLpFNQ/YhsC8oZnxM39AIBl8jSVjB3Vo17QPNih8nDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F04B5B9C48B65604A1309E0B0046B4F7CF8C7EF2", + "timestamp": "2026-01-05T18:48:49.440178566Z", + "signature": "DXfosmGYtLL344vUv2zpuqh9oeQCwCvMIBy3OwiFJ8FvPeLDu+OZyQ+9YvX5tMRUAiDpY/Q46+a2iUxSYZI1BA==" + }, + { + "block_id_flag": 2, + "validator_address": "9F1F7B9B3584198F985ADB6AA72037731D2A3C73", + "timestamp": "2026-01-05T18:48:49.421256307Z", + "signature": "cyFy+78m9IoZYy2/HL52s89u/xpFWtlsC0k7jTRZbbxgJyONNE52CTjwolVGqgRvEIVKa1GGk+3WxF4EsJnFDw==" + }, + { + "block_id_flag": 2, + "validator_address": "3D4CEB152CA0271E5A9AF577D67C828A228C87DF", + "timestamp": "2026-01-05T18:48:49.436823294Z", + "signature": "QidGl3TfF1Eu32mTVGp5j3I6/IUdjr43mrY6QXOpcr/a8vM1MB22sbg6MBp+KjHVv9RFRwRO0soUM8uD/ZOJBg==" + }, + { + "block_id_flag": 2, + "validator_address": "59E78E0B1133144460575337FAA2558399E43661", + "timestamp": "2026-01-05T18:48:49.409518086Z", + "signature": "7nOgmfV+r+C7Lt5MHS0eNuCia1Bn5aaz7ZOwDOdfMw01fl3VEGK6vUMgM36CHtYcONZhp/rxGUKMPxPfTOBQAA==" + }, + { + "block_id_flag": 2, + "validator_address": "AA5241DBD04ED2D969216D30C14D408CE3356919", + "timestamp": "2026-01-05T18:48:49.445319702Z", + "signature": "aBokEyZw7Q+nozzecIxwKIrXP1AfxKfcCBtbSMNueDPkgSGENJexX6VMIxEzEQ1IjFELyJk4MLvMVt8cDDyQAg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC60893A39B4E2DB10EC336489C71F2B537A7C65", + "timestamp": "2026-01-05T18:48:49.391370456Z", + "signature": "ilK3eLwRXsonQ1OM+AZGfsjv8MCCujpCDdeZlqp1kzyo3VrPZmX1Oijprl1UcatG7IV2Fablkhhzn5zC9BIvBA==" + }, + { + "block_id_flag": 2, + "validator_address": "B1E0490AAC5CD08248C284378296D86810410591", + "timestamp": "2026-01-05T18:48:49.406078333Z", + "signature": "loji0DQL9Y+mtqagR5410tsD319laBY7O1twrgRw9X/rqcLIeMC47ZtLKFoUVZ9mxq818q5VmpdYemAlisRSDw==" + }, + { + "block_id_flag": 2, + "validator_address": "00D66A1CB50A2473D8F011D369ADB117A527072D", + "timestamp": "2026-01-05T18:48:49.401140543Z", + "signature": "PH4u4SlZWVPEE5k0VG300n4/M8LKb+J1GGHd8Iu7w+a+zn14e8BMRUL41zqOnzGXQSqWgtZO10v1zxngdMGzDw==" + }, + { + "block_id_flag": 2, + "validator_address": "0AB238961ABDBC7C99C6693765DB290420E2ED87", + "timestamp": "2026-01-05T18:48:49.418072293Z", + "signature": "Af4pxMwGyl76MO2B14F5uEQRuCi/Z3qsFkF5SqQhJ2iJGNjVETkapcxpNWta/PlB2HhvaJVkGTK35n0U0ISBBQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E1CA4BCEB36E12283CCAB4A844A97E0C050F005A", + "timestamp": "2026-01-05T18:48:49.418684131Z", + "signature": "7942zAB42jNUzcoXlgs+dhtB3n7WwwFNq7sFrAieUc5J/Ad8u0cjbXpKm0Omrg5UGhaKllg7Okykf9ZRrcF5Ag==" + }, + { + "block_id_flag": 2, + "validator_address": "6E900C94F99B249CD8FB6538969E0D9E099C2F52", + "timestamp": "2026-01-05T18:48:49.416314883Z", + "signature": "rRZqZdCeKFdRhr8VLntaULl1ODxk261WtHFCfcL7/WcfHfu7yUeEYkckRgKQnJgjVizCIBryhD15hkLZpSotBg==" + }, + { + "block_id_flag": 2, + "validator_address": "B016593FC42B4A1988404F3D80AFEF984BD966E2", + "timestamp": "2026-01-05T18:48:49.402207338Z", + "signature": "JrwZ0ux9PeOOscstIbLXtKDznod8yfCJ8I3aXhOJxCfjbDoZOMcHEp82OWylhTifDZJ6df1rZ6bqHhNedotHDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "1394B86452A60711A0D3637E327D7D080A459B76", + "timestamp": "2026-01-05T18:48:49.404573449Z", + "signature": "PGMoQvhT9kLj/M3u74Qzo0RVAzQ6xZy4wgJFg7N7lEdYo+MDZBBicNy7GY/OKqKMeXX/TqQoJGaBQ4uZtFs1Aw==" + }, + { + "block_id_flag": 2, + "validator_address": "AB873FF0A3F0BD6D36712004C61CE8BF5970EB60", + "timestamp": "2026-01-05T18:48:49.431377562Z", + "signature": "+0xQ1vFGsyOZdBELIn2+40lwQ4l84PueY82v5vyHNBtc9M2BAb4GtjqEN+e5yPSIHRQ32DzULjcgdwpD5rilBw==" + }, + { + "block_id_flag": 2, + "validator_address": "314E76481BDEA52CEA72A30BC185B14F97E7E1D5", + "timestamp": "2026-01-05T18:48:49.413176691Z", + "signature": "4Qk07nO+z6AGvu619aabD4P3Kp/eJ6sFT17beV8iqymiKfDcE3LawSkocOR03nN+OYgI1vEY3XMSTBYiqlPHDg==" + }, + { + "block_id_flag": 2, + "validator_address": "BA479C5C63D95550191E3D6434BA557BD5F69508", + "timestamp": "2026-01-05T18:48:49.391503662Z", + "signature": "PuFZidvAPy3vWiAy35eqgzX39H2po6CWkhR5YCkCsD7cxSVF2NFJ7wW1un4mhvw3xLgVpbzpCA8zTBsVAiVLCg==" + }, + { + "block_id_flag": 2, + "validator_address": "40F909929F7FA9D475E2C6F5A94AC9D6D97CF83D", + "timestamp": "2026-01-05T18:48:49.40052186Z", + "signature": "diNLbodlI0wg96BpP2i27uO4y/YNGbSTb9PXLB+EU+S4550EnZRKpge5d1rl+hPUa43wV5MUBe0fdDE7dWU6CA==" + }, + { + "block_id_flag": 2, + "validator_address": "1AEFCC514E41F3DD21F5CE20B7BA3D142EB56256", + "timestamp": "2026-01-05T18:48:49.411004464Z", + "signature": "9N/Otx75V5qnsUoF4pqebNi4KPCFFnpIYodmZD6xcMqSZQmDisG2UZef0N7Kz2f/boluy/su/jobVJirhwc+Cw==" + }, + { + "block_id_flag": 2, + "validator_address": "114C0350B9CE023F98518D9F22A2E2E7548DAF66", + "timestamp": "2026-01-05T18:48:49.432133119Z", + "signature": "wcc7kubtws5Hb3FOdr99XROKhUWCRcdtb98kKJ4+sPEsSlTeI1DAB6P7izdNhTKjaN/gbvWltoi9WO5d9ZgrCA==" + }, + { + "block_id_flag": 2, + "validator_address": "CCC61D60E3DD1121BBBB2EA4C0039F91FD372389", + "timestamp": "2026-01-05T18:48:49.401195263Z", + "signature": "V9tVQcnV4vhJyhKYE6B1FMY6WJCFY3jXHrNDiloFhPcnfL/bT5wTdIweK0VIMkXN2N6r0LlXGIUJlZs2L0BhAA==" + }, + { + "block_id_flag": 2, + "validator_address": "25ABC30B5E07AFD6CA59EAA3495AC44D6B5C3026", + "timestamp": "2026-01-05T18:48:49.414351459Z", + "signature": "qorrktsulEY9CgnodGFGQ8Aa4bnFcxCBPp0F3jWoDuqRhKtLl2NKZSgPefIcMgn1iI4ebAeC4P20O7Bh+iz2DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "922357BD8E69E6119D0630F7ABBBF7C5E3879F2F", + "timestamp": "2026-01-05T18:48:49.433680826Z", + "signature": "oVBa91cRmYkwVMVYBXZEyNETXZUh4gtI5oVVWjMNb7j0hOAnjM7zCfueex9IlUi3AqEuPdFEgtufgNCBhOPSDA==" + }, + { + "block_id_flag": 2, + "validator_address": "A633A4EEB521DD9F09326BF5C945BC24327C6A66", + "timestamp": "2026-01-05T18:48:49.414773774Z", + "signature": "K1OFMypkH2mR60EQ+633ar9jCZrj46SVeGeATotvV8z4CIDBq/WPz4nXQo6AB+/InCfW1hjTtJGxDJBsUKxdAw==" + }, + { + "block_id_flag": 2, + "validator_address": "183388665BAC7D2537A91633FDC9ED5D6F46EF37", + "timestamp": "2026-01-05T18:48:49.429424419Z", + "signature": "7kdJ+3bizEtQXg6HXg7djAE6ecQAz3VHKuyEceQyqtz2/afYvUXwWgokygkfD3EH04c+Jwpl9M/hYUiFSZwRCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E557DD5ACE79FC5C741275673CB35719F9137DCB", + "timestamp": "2026-01-05T18:48:49.426887237Z", + "signature": "WbIqRay0Vhu/Tr48jir5XBCsGxdSCqee69hxQ3iXT39GzdUXxpTdd4EkmRCtnF4fRS/8CKyXsZu42WvzKAtDCg==" + }, + { + "block_id_flag": 2, + "validator_address": "E58F7A4F8E69795E1B0AFFF2A63C4555930F0CB1", + "timestamp": "2026-01-05T18:48:49.439710162Z", + "signature": "Qmu4+mPYdrM2F1F+xCz/Xtj9OYn3BYoorpKh18+Z0T80Zp38eg4ZyC1iemyyteNMlFX/n2xkVOLeZnsGGMpNCg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC7DC427A5EE1FEA25236DBD78AB8F66DB0AEC22", + "timestamp": "2026-01-05T18:48:49.412414886Z", + "signature": "AkkwCoUjC1P05Lxn9Wsz5twu44ZmuN28RaXaByBR0D48WfFyrFdJAb1slgWmMb9181Q6etul1duxhdr8yujXDg==" + }, + { + "block_id_flag": 2, + "validator_address": "40369FABDD947B4848FD7361B0B824A36CBF19A6", + "timestamp": "2026-01-05T18:48:49.420191652Z", + "signature": "i7B2mItd//aN7z9gz3nnoeUXTO5gdDnU3p8Yw2ixqfjYLq6KE0IxO/kK5V3CZ+rlFqO/JnI5QgHkzSfMMB+oDA==" + }, + { + "block_id_flag": 2, + "validator_address": "F40A639C3BE84EA224492A34B3C741DEC5F28444", + "timestamp": "2026-01-05T18:48:49.445735369Z", + "signature": "8j8c0BsMES1z37ChyRsP22yClG3qwaS1p48Pd5s4JfsTerzdUAWB4ISY893DXxH84wBOPrVCYkOGOnD9wH0sAw==" + }, + { + "block_id_flag": 2, + "validator_address": "8E4218ECD657CCD6FDE32C0FC0C4AC3366B71E5D", + "timestamp": "2026-01-05T18:48:49.403911864Z", + "signature": "temCJjI666aZwIh4qPJDB7Dh3WYm13So6KiHmypmwJsQmAJBfxKibCHrBrgehdc+N/WEz0DQZiBHw3AHc1GpDw==" + }, + { + "block_id_flag": 2, + "validator_address": "F0E0BFD3FEF2EC20DC7FFFA150BA9E9FECA55143", + "timestamp": "2026-01-05T18:48:49.394111876Z", + "signature": "XkKX+xVf+SmeouACTvSVrTj1JbQ4gYaClh/ywqlthj1HFZurp+YAMz02Jq03ZDWwgLZ9k+iiPyHHXBc4UBv3DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "8F7E88D0344F74BC17822506E7E29B220AD221DA", + "timestamp": "2026-01-05T18:48:49.426815066Z", + "signature": "zybIQBMYJHyV21a+gXdOc3e1BLKGuLpPbeSm+kwOsHTGylMK5rTcdY+4nqC0YXBXJn5jDsMgHChCLNgJ2m34CA==" + }, + { + "block_id_flag": 2, + "validator_address": "E06A77383534E7157F4BE3C873B25A62E7FF6428", + "timestamp": "2026-01-05T18:48:49.449723146Z", + "signature": "z8Cqe/XBzHtQw5oQ79Yi2R7S8fbLUtFjZYfLBEPniEAZUwi5rSb1LnXdcofDKgXnTnOpXZdFTm/U3uQot2COCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F878712942EE2566B849ADB75DA7993FD93AD71D", + "timestamp": "2026-01-05T18:48:49.445707809Z", + "signature": "2ugvX4rNlCaBIVkCPA+Vtz8RbY5Csp7yqBgMCLh/Hj7/XGnRgPjp8nxfkrBB7TNyz9swyye02d4xjtuXIYwJAA==" + }, + { + "block_id_flag": 2, + "validator_address": "507A1930FE00C2B4D3DAE52C7463DCDA2468A5ED", + "timestamp": "2026-01-05T18:48:49.412219661Z", + "signature": "Q6kvRQU/+ypYUVBD0mK2vzxGxPvC3wsUgMejrCGGaKYgMxYxJgXTHDDMr7vvfZN6LdG8dyHm/R7RCG1m1G9LDA==" + }, + { + "block_id_flag": 2, + "validator_address": "174071DA88C6E60CC74E5DA0DCBE80A7CF300B62", + "timestamp": "2026-01-05T18:48:49.415049646Z", + "signature": "qG/z34X+7DZLnhAbQb5b3E7YwW3epsYQtqwXWUcuq4EO/acO8tIvFIZKY5zkQzOnmxIFoWI7MYOfaVGwcvwUAA==" + }, + { + "block_id_flag": 2, + "validator_address": "59AB86020766FCDC61BB0139639D1646760F21D9", + "timestamp": "2026-01-05T18:48:49.412468053Z", + "signature": "eOTDi5RZIQClsMYAQGtsvSZW6yfFPvCUbqDTQhydS6Kl+Gj5nt2PBRjX51AitA4xikW0VDIVw/sZNaPZ5SLSDg==" + } + ] + } + } + } + }, + { + "endpoint": "Block", + "arguments": [ + "187688144" + ], + "response": { + "block_id": { + "hash": "ED809DF930894FB505167E8233E5CF74E81E76FF633683CC28B0E23898F75B6B", + "parts": { + "total": 1, + "hash": "C2AB699A4C01616340F39700D9F1BE44AFAB3D78EFC5B8AB818DA97CF334AC58" + } + }, + "block": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "pacific-1", + "height": "187688144", + "time": "2026-01-05T18:48:49.705096943Z", + "last_block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "last_commit_hash": "DECC5A41EC72A0EBB3CA880926AB672CD3B06BA3B38B18518A32C613EB3CF9BF", + "data_hash": "C813F5CD33CE639D3E1DACA248608C25D330E93889992E3D50A0F55BFED58DAD", + "validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "next_validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "consensus_hash": "7D0B88F8835DB6E92EC4E959CCD9324052C68794BC42567CFA45FB176ED6679A", + "app_hash": "B7818515F77D243F2FF2ED3E3060E6DEA773B65DFFDB860C4339BCD2DD27A06B", + "last_results_hash": "F2BA124D271707704573A4AA42922BEEBD172671473304B29E319CB78AAC7F8E", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "399548FF09159AF3711DF1EF08CC243C505130B6" + }, + "data": { + "txs": [ + "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" + ] + }, + "evidence": [], + "last_commit": { + "height": "187688143", + "round": 0, + "block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "6CA80EE04179FF609B07F9BBC65C6E47F20D09CA", + "timestamp": "2026-01-05T18:48:49.39828782Z", + "signature": "/sbaRht20zHw58u2RiL8m3gdw/d4IV1QyuP/xN6faPqgn7SE0w+zR8DtA0alnmflf13uLGBUFvwZ8e5tYyzTAA==" + }, + { + "block_id_flag": 2, + "validator_address": "399548FF09159AF3711DF1EF08CC243C505130B6", + "timestamp": "2026-01-05T18:48:49.416880259Z", + "signature": "oQT4nFIYs/NRfunUHQgl+FxrBP7tr0UYI5fl/JGqbkGFcfQlmMZpeJjsLQOU2++sHKeCrN4pJfrOLO5xRbNSDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "7482D68A8C68FD7204273223D90864207B1558B5", + "timestamp": "2026-01-05T18:48:49.419379126Z", + "signature": "h4CrFlNrE7ra7xnsXeuvtT29MKFcy1peJAL6QyzN0HldLpFNQ/YhsC8oZnxM39AIBl8jSVjB3Vo17QPNih8nDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F04B5B9C48B65604A1309E0B0046B4F7CF8C7EF2", + "timestamp": "2026-01-05T18:48:49.440178566Z", + "signature": "DXfosmGYtLL344vUv2zpuqh9oeQCwCvMIBy3OwiFJ8FvPeLDu+OZyQ+9YvX5tMRUAiDpY/Q46+a2iUxSYZI1BA==" + }, + { + "block_id_flag": 2, + "validator_address": "9F1F7B9B3584198F985ADB6AA72037731D2A3C73", + "timestamp": "2026-01-05T18:48:49.421256307Z", + "signature": "cyFy+78m9IoZYy2/HL52s89u/xpFWtlsC0k7jTRZbbxgJyONNE52CTjwolVGqgRvEIVKa1GGk+3WxF4EsJnFDw==" + }, + { + "block_id_flag": 2, + "validator_address": "3D4CEB152CA0271E5A9AF577D67C828A228C87DF", + "timestamp": "2026-01-05T18:48:49.436823294Z", + "signature": "QidGl3TfF1Eu32mTVGp5j3I6/IUdjr43mrY6QXOpcr/a8vM1MB22sbg6MBp+KjHVv9RFRwRO0soUM8uD/ZOJBg==" + }, + { + "block_id_flag": 2, + "validator_address": "59E78E0B1133144460575337FAA2558399E43661", + "timestamp": "2026-01-05T18:48:49.409518086Z", + "signature": "7nOgmfV+r+C7Lt5MHS0eNuCia1Bn5aaz7ZOwDOdfMw01fl3VEGK6vUMgM36CHtYcONZhp/rxGUKMPxPfTOBQAA==" + }, + { + "block_id_flag": 2, + "validator_address": "AA5241DBD04ED2D969216D30C14D408CE3356919", + "timestamp": "2026-01-05T18:48:49.445319702Z", + "signature": "aBokEyZw7Q+nozzecIxwKIrXP1AfxKfcCBtbSMNueDPkgSGENJexX6VMIxEzEQ1IjFELyJk4MLvMVt8cDDyQAg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC60893A39B4E2DB10EC336489C71F2B537A7C65", + "timestamp": "2026-01-05T18:48:49.391370456Z", + "signature": "ilK3eLwRXsonQ1OM+AZGfsjv8MCCujpCDdeZlqp1kzyo3VrPZmX1Oijprl1UcatG7IV2Fablkhhzn5zC9BIvBA==" + }, + { + "block_id_flag": 2, + "validator_address": "B1E0490AAC5CD08248C284378296D86810410591", + "timestamp": "2026-01-05T18:48:49.406078333Z", + "signature": "loji0DQL9Y+mtqagR5410tsD319laBY7O1twrgRw9X/rqcLIeMC47ZtLKFoUVZ9mxq818q5VmpdYemAlisRSDw==" + }, + { + "block_id_flag": 2, + "validator_address": "00D66A1CB50A2473D8F011D369ADB117A527072D", + "timestamp": "2026-01-05T18:48:49.401140543Z", + "signature": "PH4u4SlZWVPEE5k0VG300n4/M8LKb+J1GGHd8Iu7w+a+zn14e8BMRUL41zqOnzGXQSqWgtZO10v1zxngdMGzDw==" + }, + { + "block_id_flag": 2, + "validator_address": "0AB238961ABDBC7C99C6693765DB290420E2ED87", + "timestamp": "2026-01-05T18:48:49.418072293Z", + "signature": "Af4pxMwGyl76MO2B14F5uEQRuCi/Z3qsFkF5SqQhJ2iJGNjVETkapcxpNWta/PlB2HhvaJVkGTK35n0U0ISBBQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E1CA4BCEB36E12283CCAB4A844A97E0C050F005A", + "timestamp": "2026-01-05T18:48:49.418684131Z", + "signature": "7942zAB42jNUzcoXlgs+dhtB3n7WwwFNq7sFrAieUc5J/Ad8u0cjbXpKm0Omrg5UGhaKllg7Okykf9ZRrcF5Ag==" + }, + { + "block_id_flag": 2, + "validator_address": "6E900C94F99B249CD8FB6538969E0D9E099C2F52", + "timestamp": "2026-01-05T18:48:49.416314883Z", + "signature": "rRZqZdCeKFdRhr8VLntaULl1ODxk261WtHFCfcL7/WcfHfu7yUeEYkckRgKQnJgjVizCIBryhD15hkLZpSotBg==" + }, + { + "block_id_flag": 2, + "validator_address": "B016593FC42B4A1988404F3D80AFEF984BD966E2", + "timestamp": "2026-01-05T18:48:49.402207338Z", + "signature": "JrwZ0ux9PeOOscstIbLXtKDznod8yfCJ8I3aXhOJxCfjbDoZOMcHEp82OWylhTifDZJ6df1rZ6bqHhNedotHDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "1394B86452A60711A0D3637E327D7D080A459B76", + "timestamp": "2026-01-05T18:48:49.404573449Z", + "signature": "PGMoQvhT9kLj/M3u74Qzo0RVAzQ6xZy4wgJFg7N7lEdYo+MDZBBicNy7GY/OKqKMeXX/TqQoJGaBQ4uZtFs1Aw==" + }, + { + "block_id_flag": 2, + "validator_address": "AB873FF0A3F0BD6D36712004C61CE8BF5970EB60", + "timestamp": "2026-01-05T18:48:49.431377562Z", + "signature": "+0xQ1vFGsyOZdBELIn2+40lwQ4l84PueY82v5vyHNBtc9M2BAb4GtjqEN+e5yPSIHRQ32DzULjcgdwpD5rilBw==" + }, + { + "block_id_flag": 2, + "validator_address": "314E76481BDEA52CEA72A30BC185B14F97E7E1D5", + "timestamp": "2026-01-05T18:48:49.413176691Z", + "signature": "4Qk07nO+z6AGvu619aabD4P3Kp/eJ6sFT17beV8iqymiKfDcE3LawSkocOR03nN+OYgI1vEY3XMSTBYiqlPHDg==" + }, + { + "block_id_flag": 2, + "validator_address": "BA479C5C63D95550191E3D6434BA557BD5F69508", + "timestamp": "2026-01-05T18:48:49.391503662Z", + "signature": "PuFZidvAPy3vWiAy35eqgzX39H2po6CWkhR5YCkCsD7cxSVF2NFJ7wW1un4mhvw3xLgVpbzpCA8zTBsVAiVLCg==" + }, + { + "block_id_flag": 2, + "validator_address": "40F909929F7FA9D475E2C6F5A94AC9D6D97CF83D", + "timestamp": "2026-01-05T18:48:49.40052186Z", + "signature": "diNLbodlI0wg96BpP2i27uO4y/YNGbSTb9PXLB+EU+S4550EnZRKpge5d1rl+hPUa43wV5MUBe0fdDE7dWU6CA==" + }, + { + "block_id_flag": 2, + "validator_address": "1AEFCC514E41F3DD21F5CE20B7BA3D142EB56256", + "timestamp": "2026-01-05T18:48:49.411004464Z", + "signature": "9N/Otx75V5qnsUoF4pqebNi4KPCFFnpIYodmZD6xcMqSZQmDisG2UZef0N7Kz2f/boluy/su/jobVJirhwc+Cw==" + }, + { + "block_id_flag": 2, + "validator_address": "114C0350B9CE023F98518D9F22A2E2E7548DAF66", + "timestamp": "2026-01-05T18:48:49.432133119Z", + "signature": "wcc7kubtws5Hb3FOdr99XROKhUWCRcdtb98kKJ4+sPEsSlTeI1DAB6P7izdNhTKjaN/gbvWltoi9WO5d9ZgrCA==" + }, + { + "block_id_flag": 2, + "validator_address": "CCC61D60E3DD1121BBBB2EA4C0039F91FD372389", + "timestamp": "2026-01-05T18:48:49.401195263Z", + "signature": "V9tVQcnV4vhJyhKYE6B1FMY6WJCFY3jXHrNDiloFhPcnfL/bT5wTdIweK0VIMkXN2N6r0LlXGIUJlZs2L0BhAA==" + }, + { + "block_id_flag": 2, + "validator_address": "25ABC30B5E07AFD6CA59EAA3495AC44D6B5C3026", + "timestamp": "2026-01-05T18:48:49.414351459Z", + "signature": "qorrktsulEY9CgnodGFGQ8Aa4bnFcxCBPp0F3jWoDuqRhKtLl2NKZSgPefIcMgn1iI4ebAeC4P20O7Bh+iz2DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "922357BD8E69E6119D0630F7ABBBF7C5E3879F2F", + "timestamp": "2026-01-05T18:48:49.433680826Z", + "signature": "oVBa91cRmYkwVMVYBXZEyNETXZUh4gtI5oVVWjMNb7j0hOAnjM7zCfueex9IlUi3AqEuPdFEgtufgNCBhOPSDA==" + }, + { + "block_id_flag": 2, + "validator_address": "A633A4EEB521DD9F09326BF5C945BC24327C6A66", + "timestamp": "2026-01-05T18:48:49.414773774Z", + "signature": "K1OFMypkH2mR60EQ+633ar9jCZrj46SVeGeATotvV8z4CIDBq/WPz4nXQo6AB+/InCfW1hjTtJGxDJBsUKxdAw==" + }, + { + "block_id_flag": 2, + "validator_address": "183388665BAC7D2537A91633FDC9ED5D6F46EF37", + "timestamp": "2026-01-05T18:48:49.429424419Z", + "signature": "7kdJ+3bizEtQXg6HXg7djAE6ecQAz3VHKuyEceQyqtz2/afYvUXwWgokygkfD3EH04c+Jwpl9M/hYUiFSZwRCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E557DD5ACE79FC5C741275673CB35719F9137DCB", + "timestamp": "2026-01-05T18:48:49.426887237Z", + "signature": "WbIqRay0Vhu/Tr48jir5XBCsGxdSCqee69hxQ3iXT39GzdUXxpTdd4EkmRCtnF4fRS/8CKyXsZu42WvzKAtDCg==" + }, + { + "block_id_flag": 2, + "validator_address": "E58F7A4F8E69795E1B0AFFF2A63C4555930F0CB1", + "timestamp": "2026-01-05T18:48:49.439710162Z", + "signature": "Qmu4+mPYdrM2F1F+xCz/Xtj9OYn3BYoorpKh18+Z0T80Zp38eg4ZyC1iemyyteNMlFX/n2xkVOLeZnsGGMpNCg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC7DC427A5EE1FEA25236DBD78AB8F66DB0AEC22", + "timestamp": "2026-01-05T18:48:49.412414886Z", + "signature": "AkkwCoUjC1P05Lxn9Wsz5twu44ZmuN28RaXaByBR0D48WfFyrFdJAb1slgWmMb9181Q6etul1duxhdr8yujXDg==" + }, + { + "block_id_flag": 2, + "validator_address": "40369FABDD947B4848FD7361B0B824A36CBF19A6", + "timestamp": "2026-01-05T18:48:49.420191652Z", + "signature": "i7B2mItd//aN7z9gz3nnoeUXTO5gdDnU3p8Yw2ixqfjYLq6KE0IxO/kK5V3CZ+rlFqO/JnI5QgHkzSfMMB+oDA==" + }, + { + "block_id_flag": 2, + "validator_address": "F40A639C3BE84EA224492A34B3C741DEC5F28444", + "timestamp": "2026-01-05T18:48:49.445735369Z", + "signature": "8j8c0BsMES1z37ChyRsP22yClG3qwaS1p48Pd5s4JfsTerzdUAWB4ISY893DXxH84wBOPrVCYkOGOnD9wH0sAw==" + }, + { + "block_id_flag": 2, + "validator_address": "8E4218ECD657CCD6FDE32C0FC0C4AC3366B71E5D", + "timestamp": "2026-01-05T18:48:49.403911864Z", + "signature": "temCJjI666aZwIh4qPJDB7Dh3WYm13So6KiHmypmwJsQmAJBfxKibCHrBrgehdc+N/WEz0DQZiBHw3AHc1GpDw==" + }, + { + "block_id_flag": 2, + "validator_address": "F0E0BFD3FEF2EC20DC7FFFA150BA9E9FECA55143", + "timestamp": "2026-01-05T18:48:49.394111876Z", + "signature": "XkKX+xVf+SmeouACTvSVrTj1JbQ4gYaClh/ywqlthj1HFZurp+YAMz02Jq03ZDWwgLZ9k+iiPyHHXBc4UBv3DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "8F7E88D0344F74BC17822506E7E29B220AD221DA", + "timestamp": "2026-01-05T18:48:49.426815066Z", + "signature": "zybIQBMYJHyV21a+gXdOc3e1BLKGuLpPbeSm+kwOsHTGylMK5rTcdY+4nqC0YXBXJn5jDsMgHChCLNgJ2m34CA==" + }, + { + "block_id_flag": 2, + "validator_address": "E06A77383534E7157F4BE3C873B25A62E7FF6428", + "timestamp": "2026-01-05T18:48:49.449723146Z", + "signature": "z8Cqe/XBzHtQw5oQ79Yi2R7S8fbLUtFjZYfLBEPniEAZUwi5rSb1LnXdcofDKgXnTnOpXZdFTm/U3uQot2COCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F878712942EE2566B849ADB75DA7993FD93AD71D", + "timestamp": "2026-01-05T18:48:49.445707809Z", + "signature": "2ugvX4rNlCaBIVkCPA+Vtz8RbY5Csp7yqBgMCLh/Hj7/XGnRgPjp8nxfkrBB7TNyz9swyye02d4xjtuXIYwJAA==" + }, + { + "block_id_flag": 2, + "validator_address": "507A1930FE00C2B4D3DAE52C7463DCDA2468A5ED", + "timestamp": "2026-01-05T18:48:49.412219661Z", + "signature": "Q6kvRQU/+ypYUVBD0mK2vzxGxPvC3wsUgMejrCGGaKYgMxYxJgXTHDDMr7vvfZN6LdG8dyHm/R7RCG1m1G9LDA==" + }, + { + "block_id_flag": 2, + "validator_address": "174071DA88C6E60CC74E5DA0DCBE80A7CF300B62", + "timestamp": "2026-01-05T18:48:49.415049646Z", + "signature": "qG/z34X+7DZLnhAbQb5b3E7YwW3epsYQtqwXWUcuq4EO/acO8tIvFIZKY5zkQzOnmxIFoWI7MYOfaVGwcvwUAA==" + }, + { + "block_id_flag": 2, + "validator_address": "59AB86020766FCDC61BB0139639D1646760F21D9", + "timestamp": "2026-01-05T18:48:49.412468053Z", + "signature": "eOTDi5RZIQClsMYAQGtsvSZW6yfFPvCUbqDTQhydS6Kl+Gj5nt2PBRjX51AitA4xikW0VDIVw/sZNaPZ5SLSDg==" + } + ] + } + } + } + }, + { + "endpoint": "BlockResults", + "arguments": [ + "187688144" + ], + "response": { + "height": "187688144", + "txs_results": [ + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1ummny4p645xraxc4m7nphf7vxawfzt3p5hn47t\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536698611783429uosmo,0.127965750554105634usei,1.000002971409113288uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei16dckxyuc6w3cmxktr908afhenwg88j5qap2l00\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTZkY2t4eXVjNnczY214a3RyOTA4YWZoZW53Zzg4ajVxYXAybDAw", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTZkY2t4eXVjNnczY214a3RyOTA4YWZoZW53Zzg4ajVxYXAybDAwLzkyNzYzOTY1", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "eUZpeCsvVVFqR2dISUtnMmNmeXVoeklCUTNuSkl4ZXh2K1UyWUJuSUxFUWdFa0VGcWIrWWtlakVVU3VsaVVtU1VtQjBRZTNiTzVIMzhwT1gzZ1JyVUE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg5OTNBRDlkMDVEZmJlQkQzM0ZkQjY1MzI3ODQ5MjYyQTU2M2MzNDY1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTZkY2t4eXVjNnczY214a3RyOTA4YWZoZW53Zzg4ajVxYXAybDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF1bW1ueTRwNjQ1eHJheGM0bTducGhmN3Z4YXdmenQzcDVobjQ3dA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwMjk3MTQwOTExMzI4OHV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTZkY2t4eXVjNnczY214a3RyOTA4YWZoZW53Zzg4ajVxYXAybDAw", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper10plkkmv757pfydyqc97s87zgqt84vry6dx6q9k\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.261293325831966554ubtc,3207.252281463794049175ueth,0.056536876589244999uosmo,0.127965486962797496usei,1.000003232269243565uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1vf6zqm7z3z80qes2hc9gupmgxaap25qvw8ewn2\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXZmNnpxbTd6M3o4MHFlczJoYzlndXBtZ3hhYXAyNXF2dzhld24y", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXZmNnpxbTd6M3o4MHFlczJoYzlndXBtZ3hhYXAyNXF2dzhld24yLzc3NDkzOTc4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "VHRWc3d2VEtvZkJZT1pRY1l4ODdzbHFKR2pOakg3a3RYdU52UzRldmI1dGt0YkZTelgrWmt2Q0JZQW1ZLzUvcSthSTBTNHNYK2o3SXVKeXh1aWMwV3c9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhiNTlCYWMyNzE2MTYzOUUwMWY2NmNGNUYwMTlmMEFBYmNBRUQxNWE1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXZmNnpxbTd6M3o4MHFlczJoYzlndXBtZ3hhYXAyNXF2dzhld24y", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjEwcGxra212NzU3cGZ5ZHlxYzk3czg3emdxdDg0dnJ5NmR4NnE5aw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjEyOTMzMjU4MzE5NjY1NTR1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDg2OTYyNzk3NDk2dXNlaSwxLjAwMDAwMzIzMjI2OTI0MzU2NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXZmNnpxbTd6M3o4MHFlczJoYzlndXBtZ3hhYXAyNXF2dzhld24y", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1hnkkqnzwmyw652muh6wfea7xlfgplnyj0ku4w4\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536876589244999uosmo,0.127965726722341304usei,1.000009487329351911uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1ykxlrpkrkcnhvwnmcq8tfkqhmsaanaejphz6ps\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXlreGxycGtya2NuaHZ3bm1jcTh0ZmtxaG1zYWFuYWVqcGh6NnBz", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXlreGxycGtya2NuaHZ3bm1jcTh0ZmtxaG1zYWFuYWVqcGh6NnBzLzkyNzI1NTAz", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "alJCSWlmbGFwUy9zV1k3M3V0blZHL0h5WmN3NWg1YThReWlKMktKNmlrTVJIZ3RvdDcyTzZ1bU9FS2NpTm1wam9HS1A4ZFlscXVQS2dLeTVaWkZSNFE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg3RjI5NzcxZEYzOUY2YjIzMjYwQkE4YTM4ZGQ4MTRlMTg0MUQ3RmI4", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXlreGxycGtya2NuaHZ3bm1jcTh0ZmtxaG1zYWFuYWVqcGh6NnBz", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFobmtrcW56d215dzY1Mm11aDZ3ZmVhN3hsZmdwbG55ajBrdTR3NA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzI2NzIyMzQxMzA0dXNlaSwxLjAwMDAwOTQ4NzMyOTM1MTkxMXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXlreGxycGtya2NuaHZ3bm1jcTh0ZmtxaG1zYWFuYWVqcGh6NnBz", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1eqgnd7ey0hnha8rrfukjrsawulhna0zagcg6a4\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536698611783429uosmo,0.127965750554105634usei,1.000001907218205980uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1nurfe690mer9dmy8pp7resdsfx3pya7h9qw39l\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMW51cmZlNjkwbWVyOWRteThwcDdyZXNkc2Z4M3B5YTdoOXF3Mzls", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMW51cmZlNjkwbWVyOWRteThwcDdyZXNkc2Z4M3B5YTdoOXF3MzlsLzkzNjY3MzM4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "MFBhRE1TbzNyMm1YazFaU0tBUEJmMUdzS3NHSWlqUGJNMURaeDlseUE2czBHenc2QXZCZ3c5VzVHcmJhTGtRRWxVK1BWUDJhcEkyS2hORTNuT1R3ckE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhlMjIxYkJFZjVmQWU4QjI4NTlhODVBYTZlNGQyZjYyMDM0NGYyYTg2", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMW51cmZlNjkwbWVyOWRteThwcDdyZXNkc2Z4M3B5YTdoOXF3Mzls", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFlcWduZDdleTBobmhhOHJyZnVranJzYXd1bGhuYTB6YWdjZzZhNA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwMTkwNzIxODIwNTk4MHV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMW51cmZlNjkwbWVyOWRteThwcDdyZXNkc2Z4M3B5YTdoOXF3Mzls", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1xh2gf9gyvumlgpr9ws5n425vhntv9rysw9gr4q\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.263421207670719753ubtc,3207.252150477261911270ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003236393725095uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1u5qgx3ephw2kv5jtmt2l6cld5rjgxgyt400a83\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXU1cWd4M2VwaHcya3Y1anRtdDJsNmNsZDVyamd4Z3l0NDAwYTgz", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXU1cWd4M2VwaHcya3Y1anRtdDJsNmNsZDVyamd4Z3l0NDAwYTgzLzkyNTM4MjQ5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "SEpVbVF4cmhVMEVrUERvQStXVXNkc3lGdjEzRXVlRTNBM3QxOVYvMjBLb2Z2R2IxZFNLVCsxTU11dmg4T1hUa05Vc3A2QVp1R3ZIeEFxb0dGV3U1eEE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhiYWFmODNkNmI0ZjFhNjk0MTBjM0IxNzhjODkyMEJFOGY3NTE5ZDdj", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXU1cWd4M2VwaHcya3Y1anRtdDJsNmNsZDVyamd4Z3l0NDAwYTgz", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF4aDJnZjlneXZ1bWxncHI5d3M1bjQyNXZobnR2OXJ5c3c5Z3I0cQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjM0MjEyMDc2NzA3MTk3NTN1YnRjLDMyMDcuMjUyMTUwNDc3MjYxOTExMjcwdWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzNjM5MzcyNTA5NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXU1cWd4M2VwaHcya3Y1anRtdDJsNmNsZDVyamd4Z3l0NDAwYTgz", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper15xgfk9cnt56xjvqvetjvg3wlqlslfnqfc03dwk\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536698611783429uosmo,0.127965780138953410usei,1.000003071265074913uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei10qa0g0hsne0gk0lnc3y90cql4535cxa2yn9fcm\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTBxYTBnMGhzbmUwZ2swbG5jM3k5MGNxbDQ1MzVjeGEyeW45ZmNt", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTBxYTBnMGhzbmUwZ2swbG5jM3k5MGNxbDQ1MzVjeGEyeW45ZmNtLzkyNjg2MDIz", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "VFg0V21ubjE0SWg2RmltTVlLWDBnaGtoblRzUlN6NmpqNVg4NDJJbkRMeGFYUllUU2JzbUF1REJpZmlzMmNJUkk2TG9xbnp4eFJZN1Raa1pKM2ZleXc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgxMGQ5NzA0RWM2ZWRGOEMwQzIzNTg4MDBFM2UzZDg4MTVEMzJkNjIy", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTBxYTBnMGhzbmUwZ2swbG5jM3k5MGNxbDQ1MzVjeGEyeW45ZmNt", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzgwMTM4OTUzNDEwdXNlaSwxLjAwMDAwMzA3MTI2NTA3NDkxM3V1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTBxYTBnMGhzbmUwZ2swbG5jM3k5MGNxbDQ1MzVjeGEyeW45ZmNt", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1mm5p6ak2w94cwry0n42px3ssajgytxnwfvd4w8\"},{\"key\":\"exchange_rates\",\"value\":\"2.374940236378822652uatom,94148.250982459988266698ubtc,3207.247665588580278975ueth,0.056536698611783429uosmo,0.127964116848212618usei,1.000076545827674901uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1acq5rjeq320uvqwgzlsagr2urvvufzwenkqpvn\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWFjcTVyamVxMzIwdXZxd2d6bHNhZ3IydXJ2dnVmendlbmtxcHZu", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWFjcTVyamVxMzIwdXZxd2d6bHNhZ3IydXJ2dnVmendlbmtxcHZuLzkxMzE5NTYw", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "cFYxNm5wRkp2K0lZVTVkaExFYnBiMXZuaTVrRDgyY3BHMU8zbkVMallldzYzQWh4TGZDOTExZ0MvR25DSmk4TGtScCtVN3VJSFNEcGRhVWxBU0I0NXc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1YTREYzdCOTQ3M2M1NzQ3YjkwODFhMTg3QjQ4RUQ2MWM0YTFmMGJm", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWFjcTVyamVxMzIwdXZxd2d6bHNhZ3IydXJ2dnVmendlbmtxcHZu", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFtbTVwNmFrMnc5NGN3cnkwbjQycHgzc3Nhamd5dHhud2Z2ZDR3OA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ5NDAyMzYzNzg4MjI2NTJ1YXRvbSw5NDE0OC4yNTA5ODI0NTk5ODgyNjY2OTh1YnRjLDMyMDcuMjQ3NjY1NTg4NTgwMjc4OTc1dWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY0MTE2ODQ4MjEyNjE4dXNlaSwxLjAwMDA3NjU0NTgyNzY3NDkwMXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWFjcTVyamVxMzIwdXZxd2d6bHNhZ3IydXJ2dnVmendlbmtxcHZu", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper146m089lq8mkqw6w0mmlhxz6247g2taha89at74\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536876589244999uosmo,0.127965487931222704usei,1.000004134370208517uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1ay3j0cpae2tppuu374tfqht7n70d45vz9uch5e\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWF5M2owY3BhZTJ0cHB1dTM3NHRmcWh0N243MGQ0NXZ6OXVjaDVl", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWF5M2owY3BhZTJ0cHB1dTM3NHRmcWh0N243MGQ0NXZ6OXVjaDVlLzM5MDUxMzE4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "NHY0blFPM0ltNDRQNk15b3A4VTJHNlpnSWE4bXdlVUpmQnM5QUdmYmozY00zRkpWUXJseGRNdmV5OSttZE5HcTVlUURrRTJGSlpOWVlVU21hakZCQWc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgyMDk5OTE2NkQ4MmY4QmNEYzgzRTY5OWNEQUI1MGZlNUExN2I5Yzgy", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWF5M2owY3BhZTJ0cHB1dTM3NHRmcWh0N243MGQ0NXZ6OXVjaDVl", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE0Nm0wODlscThta3F3NncwbW1saHh6NjI0N2cydGFoYTg5YXQ3NA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDg3OTMxMjIyNzA0dXNlaSwxLjAwMDAwNDEzNDM3MDIwODUxN3V1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWF5M2owY3BhZTJ0cHB1dTM3NHRmcWh0N243MGQ0NXZ6OXVjaDVl", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1ctnle8anjvrsf7h2cdwewwa377x63ec3ukfe6h\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.261199905892492990ubtc,3207.251797029775146576ueth,0.056536876589244999uosmo,0.127965771438187656usei,1.000001945815119900uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei14gcl2gvj4y4zey5j2kpek25wg0f4ns7fpcd8c6\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTRnY2wyZ3ZqNHk0emV5NWoya3BlazI1d2cwZjRuczdmcGNkOGM2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTRnY2wyZ3ZqNHk0emV5NWoya3BlazI1d2cwZjRuczdmcGNkOGM2LzY2NjQ2OTg5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "UXVJK3Q4SktlVnVJZmhIU29NUTRhL2J3U3RHb2FaRFlnVi9WSkhIeGkrWmRrZG9pUm9mN0dQamVVbHV4TDdxUDJZdk82bWNrYm5ubEVjYTE0T3RPS3c9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg0RTRhYzJiOEI1ODllOTI5QTBjYTI4NGMzNzFiQUUwODM4ODYzMkM3", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTRnY2wyZ3ZqNHk0emV5NWoya3BlazI1d2cwZjRuczdmcGNkOGM2", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFjdG5sZThhbmp2cnNmN2gyY2R3ZXd3YTM3N3g2M2VjM3VrZmU2aA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjExOTk5MDU4OTI0OTI5OTB1YnRjLDMyMDcuMjUxNzk3MDI5Nzc1MTQ2NTc2dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk0NTgxNTExOTkwMHV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTRnY2wyZ3ZqNHk0emV5NWoya3BlazI1d2cwZjRuczdmcGNkOGM2", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1garz4kjfgar8dwypayufca2mujgtfxlv6kte03\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.261293325831966554ubtc,3207.252281463794049175ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003232269243565uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei18mjfdutlrepqxqtkhgrljfsj8g75ncsquftwxl\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMThtamZkdXRscmVwcXhxdGtoZ3JsamZzajhnNzVuY3NxdWZ0d3hs", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMThtamZkdXRscmVwcXhxdGtoZ3JsamZzajhnNzVuY3NxdWZ0d3hsLzkxMzg4NDcx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "ZHVOT296aWNEQkIxdjRLcTYvMG1kUHpKaS9HT1hyRWs2NjRkRlp1SFc4ZHl3SWpWS05OVk4wQUNzdmNMcFRkUDk1U1RGMlJjWXM2UWFhc1hBVlN1M0E9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhCNzcxODU1NDlCZjlEYTczYTUwNzM5NTY1MjBDODM3QUZCY2E4OENG", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMThtamZkdXRscmVwcXhxdGtoZ3JsamZzajhnNzVuY3NxdWZ0d3hs", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFnYXJ6NGtqZmdhcjhkd3lwYXl1ZmNhMm11amd0ZnhsdjZrdGUwMw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjEyOTMzMjU4MzE5NjY1NTR1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzMjI2OTI0MzU2NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMThtamZkdXRscmVwcXhxdGtoZ3JsamZzajhnNzVuY3NxdWZ0d3hs", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1uxlf7mvr8nep3gm7udf2u9remms2jyjq6ee35g\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.262442435681545592ubtc,3207.251830286138490235ueth,0.056536876589244999uosmo,0.127965757152878967usei,1.000009200250843505uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei17mel6z2u36uklcpudajyt4ts7s8kvu70cjqs8y\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTdtZWw2ejJ1MzZ1a2xjcHVkYWp5dDR0czdzOGt2dTcwY2pxczh5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTdtZWw2ejJ1MzZ1a2xjcHVkYWp5dDR0czdzOGt2dTcwY2pxczh5LzgxNzMxMDI=", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "VTBGWlNaRmlHRlBaL2VJejB2dDc4aGJwY0xNNmFPZ0YxSGgveTRBV3ZNMGRNVVprZVV1SXh6REFRb25UcjJ2NWNVTW1NNXhrVUpMWTltZ0dnM2YvdlE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg4NEQ1M0ZjODg5QTlENEQzMENjOUEyNjJjNjUwM2M2NmI1RjNlODc5", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTdtZWw2ejJ1MzZ1a2xjcHVkYWp5dDR0czdzOGt2dTcwY2pxczh5", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF1eGxmN212cjhuZXAzZ203dWRmMnU5cmVtbXMyanlqcTZlZTM1Zw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjI0NDI0MzU2ODE1NDU1OTJ1YnRjLDMyMDcuMjUxODMwMjg2MTM4NDkwMjM1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzU3MTUyODc4OTY3dXNlaSwxLjAwMDAwOTIwMDI1MDg0MzUwNXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTdtZWw2ejJ1MzZ1a2xjcHVkYWp5dDR0czdzOGt2dTcwY2pxczh5", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper140l6y2gp3gxvay6qtn70re7z2s0gn57zl6nups\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.261293325831966554ubtc,3207.252281463794049175ueth,0.056536876589244999uosmo,0.127965450828424074usei,1.000004132379595687uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1ghjz5yxx0s73afsjnpyjas7l437h6fg0fazddn\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWdoano1eXh4MHM3M2Fmc2pucHlqYXM3bDQzN2g2ZmcwZmF6ZGRu", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWdoano1eXh4MHM3M2Fmc2pucHlqYXM3bDQzN2g2ZmcwZmF6ZGRuLzg4MDU2MTM2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "RVJkT2R2K3lVelVuaUp1MzJ4bk11QytwQXUzUVBTNWJsYlpJN3pBbTN6UUtCRFJQZmJ1SmhXMlZyUy9CMzMwQlNOL245c2NXbHcwd3M5Q0tpT1ZwUVE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg3MTM4MDllMTYwZjA5NTc4MGUwZTQ1QTJmMDZFZTU1M0FEMTJEZTFm", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWdoano1eXh4MHM3M2Fmc2pucHlqYXM3bDQzN2g2ZmcwZmF6ZGRu", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE0MGw2eTJncDNneHZheTZxdG43MHJlN3oyczBnbjU3emw2bnVwcw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjEyOTMzMjU4MzE5NjY1NTR1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDUwODI4NDI0MDc0dXNlaSwxLjAwMDAwNDEzMjM3OTU5NTY4N3V1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWdoano1eXh4MHM3M2Fmc2pucHlqYXM3bDQzN2g2ZmcwZmF6ZGRu", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper12kv03zmlsqx8xpkk05d8e9d05jan76wxwtpdpd\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.261199905892492990ubtc,3207.251797029775146576ueth,0.056536876589244999uosmo,0.127965486962797496usei,1.000003238387052635uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1vy0v2qee9wtfrspxs3wkxsfl7jmpfjgrrxefku\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXZ5MHYycWVlOXd0ZnJzcHhzM3dreHNmbDdqbXBmamdycnhlZmt1", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXZ5MHYycWVlOXd0ZnJzcHhzM3dreHNmbDdqbXBmamdycnhlZmt1LzQ2NjQxNzM=", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "U2J2MXY0ZmpQaFJtS2hFMzdHWll1Vnhnd0x6QnFQV05ISm9DWnZFK2VsRjBJY3d3aGRoZWtZb0x6aWhMU240dUpFY3ZqaE9BR3hkUGt4MzhhdkZtRlE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg4NUU1RkRmNkY3Y0VCMzdjOGNDOTk3NDY1MThCMThBMUIxMWNEZTA5", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXZ5MHYycWVlOXd0ZnJzcHhzM3dreHNmbDdqbXBmamdycnhlZmt1", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjEya3YwM3ptbHNxeDh4cGtrMDVkOGU5ZDA1amFuNzZ3eHd0cGRwZA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjExOTk5MDU4OTI0OTI5OTB1YnRjLDMyMDcuMjUxNzk3MDI5Nzc1MTQ2NTc2dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDg2OTYyNzk3NDk2dXNlaSwxLjAwMDAwMzIzODM4NzA1MjYzNXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXZ5MHYycWVlOXd0ZnJzcHhzM3dreHNmbDdqbXBmamdycnhlZmt1", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1zv9z2wqt348dhxqn38xv8dvsu78cle4xs2cdf4\"},{\"key\":\"exchange_rates\",\"value\":\"2.374707466385658021uatom,94148.261293470186826257ubtc,3207.252281463794049175ueth,0.056536876837045865uosmo,0.127965480350742837usei,1.000003237380819795uusdc,0.999711711090070343uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1tmxrwgmdplqzq5kvq06778pwue06qzuynfc32e\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXRteHJ3Z21kcGxxenE1a3ZxMDY3Nzhwd3VlMDZxenV5bmZjMzJl", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXRteHJ3Z21kcGxxenE1a3ZxMDY3Nzhwd3VlMDZxenV5bmZjMzJlLzkyOTQ1ODQx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "NFJmT1lIS3pqZHduWlU2VkVqbCtwMkRqaytZL1g1d0M0WEh2ZEQ3SkNZMFVoUHpFL1NvYlBYZE04THhsUEVDZC82MkZtb0xNd2RWUFpGZjA1VGpiQmc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhkYjJCNDYzMTQ4QzFGMTY1NEEzN2VjQkE3N0JiNDVFMDcyMkMwYmIx", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXRteHJ3Z21kcGxxenE1a3ZxMDY3Nzhwd3VlMDZxenV5bmZjMzJl", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF6djl6MndxdDM0OGRoeHFuMzh4djhkdnN1NzhjbGU0eHMyY2RmNA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDc0NjYzODU2NTgwMjF1YXRvbSw5NDE0OC4yNjEyOTM0NzAxODY4MjYyNTd1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjgzNzA0NTg2NXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzNzM4MDgxOTc5NXV1c2RjLDAuOTk5NzExNzExMDkwMDcwMzQzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXRteHJ3Z21kcGxxenE1a3ZxMDY3Nzhwd3VlMDZxenV5bmZjMzJl", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper18tpdet22kpvswxayekwn55ry0r5acx4kaauupk\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.261293325831966554ubtc,3207.252281463794049175ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003236393725095uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei14qrcwmzpdszq0gehfq63rarm7pxqwxm7xarcxj\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTRxcmN3bXpwZHN6cTBnZWhmcTYzcmFybTdweHF3eG03eGFyY3hq", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTRxcmN3bXpwZHN6cTBnZWhmcTYzcmFybTdweHF3eG03eGFyY3hqLzg4MjY4MzYx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "dERKYllqcDJzL00reTIwcnVzbFA2ZGExcGxUYXZuVVJJejJsMlRoZW1qQXJ4TkUzclAvZnBSOW9WUlNKMWZXNVVmTS80SllDU3hIOWhSWjlMSHp6Nnc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgyNDQyMDI2MTMyNDA3QzhiYzAwMkZiNjBjMzAyOGI0NzlDQWQ4OEVk", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTRxcmN3bXpwZHN6cTBnZWhmcTYzcmFybTdweHF3eG03eGFyY3hq", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE4dHBkZXQyMmtwdnN3eGF5ZWt3bjU1cnkwcjVhY3g0a2FhdXVwaw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjEyOTMzMjU4MzE5NjY1NTR1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzNjM5MzcyNTA5NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTRxcmN3bXpwZHN6cTBnZWhmcTYzcmFybTdweHF3eG03eGFyY3hq", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1mee6kysxzp99kfvgk7nqx7lrqg8txmw7kap9gy\"},{\"key\":\"exchange_rates\",\"value\":\"2.374710481043531646uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536698611783429uosmo,0.127965750554105634usei,1.000009473285757958uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1fj0rz6hw0g3p5fh2dmq7pedzv72s85hxck26av\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWZqMHJ6Nmh3MGczcDVmaDJkbXE3cGVkenY3MnM4NWh4Y2syNmF2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWZqMHJ6Nmh3MGczcDVmaDJkbXE3cGVkenY3MnM4NWh4Y2syNmF2LzY5OTEzMTA0", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "MGRhVTJ6TjU3VGg5R0t6YnVTSzc0WmJyWW5FaXVqV3hQUWs0UUxHOFI3ZGMzZ0lueGprcTlZdDFwbkZPYXRlMUVaRzNWQktwaitadTd5K0hQMGhVa1E9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhBMEM4N2IwNEM1Mjk4NUE3ZWQ1Y0Y5QWEwNTkyNjgwN2M4MkE5NGFm", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWZqMHJ6Nmh3MGczcDVmaDJkbXE3cGVkenY3MnM4NWh4Y2syNmF2", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFtZWU2a3lzeHpwOTlrZnZnazducXg3bHJxZzh0eG13N2thcDlneQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MTA0ODEwNDM1MzE2NDZ1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwOTQ3MzI4NTc1Nzk1OHV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWZqMHJ6Nmh3MGczcDVmaDJkbXE3cGVkenY3MnM4NWh4Y2syNmF2", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper135p82ndukuuezeugaetxx0sjj9knwgpegcctqp\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003238387052635uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1m48kfe6mmnn0gjrjhteh6gxun2eyrm3qqvxn0f\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMW00OGtmZTZtbW5uMGdqcmpodGVoNmd4dW4yZXlybTNxcXZ4bjBm", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMW00OGtmZTZtbW5uMGdqcmpodGVoNmd4dW4yZXlybTNxcXZ4bjBmLzkwNjI1NzM=", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "MUthazMrb0tRaW1iVUdGQXNKQjEvZFdkY2tNOU92alMweFJHbWJtckhBZ0tnNHN4TnlFR3RKK1pyVWQ2SEl5dUVXMFRrZkpvUm9WT3V0ZHFxMWpGR2c9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1MDA2YTI4RDc1RDQ0MEM4QzNjODk1NjM3NWM2NzE4OTZhNzM2Q2Rk", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMW00OGtmZTZtbW5uMGdqcmpodGVoNmd4dW4yZXlybTNxcXZ4bjBm", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjEzNXA4Mm5kdWt1dWV6ZXVnYWV0eHgwc2pqOWtud2dwZWdjY3RxcA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzODM4NzA1MjYzNXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMW00OGtmZTZtbW5uMGdqcmpodGVoNmd4dW4yZXlybTNxcXZ4bjBm", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper16pj5gljqnqs0ajxakccfjhu05yczp98743ctgy\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.262839130394574605ubtc,3207.252559662459322773ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003232269243565uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1vhj8aavtx77g5p29na07a4slasv4r4ehm5qn53\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXZoajhhYXZ0eDc3ZzVwMjluYTA3YTRzbGFzdjRyNGVobTVxbjUz", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXZoajhhYXZ0eDc3ZzVwMjluYTA3YTRzbGFzdjRyNGVobTVxbjUzLzkyOTEyODY5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "OWZ3MlNDdWtaVmFSdU1OOURhQ2FPZzVoc1hhN1AwOXpHYkNyOWdUQTRZWVRJT1U3MHIvQUM4U092YUFYMGN2M0FUWWhtZzVqZEFzTlphOXZwZjlGM1E9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgwODQ2Nzk2QTI1ZjMyMjg4QzVhZjY0Nzc2Yjg0NTNkNkMwQmI5MUUx", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXZoajhhYXZ0eDc3ZzVwMjluYTA3YTRzbGFzdjRyNGVobTVxbjUz", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE2cGo1Z2xqcW5xczBhanhha2NjZmpodTA1eWN6cDk4NzQzY3RneQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjI4MzkxMzAzOTQ1NzQ2MDV1YnRjLDMyMDcuMjUyNTU5NjYyNDU5MzIyNzczdWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzMjI2OTI0MzU2NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXZoajhhYXZ0eDc3ZzVwMjluYTA3YTRzbGFzdjRyNGVobTVxbjUz", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1mpe9rdk7ycujge7r9ncjt4ekamgrdcygvzwqe8\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.262442435681545592ubtc,3207.251830286138490235ueth,0.056536876589244999uosmo,0.127965481319353577usei,1.000009578390531698uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1xrrfek3qpz4ja8ccrjklfy064asyqq9k778ejw\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXhycmZlazNxcHo0amE4Y2NyamtsZnkwNjRhc3lxcTlrNzc4ZWp3", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXhycmZlazNxcHo0amE4Y2NyamtsZnkwNjRhc3lxcTlrNzc4ZWp3LzkyNTEzMzU2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "b1pHcEFNOWttQkp6Z2hnWXhzdGRabVVWQWRxTzV2UFpvbWZBY2UxWnYyRmdieTlzMEZsTi8rdHlhalZjanZwUVd4cTIrYVhOb2Nrb3ZjNFNOcE9Uenc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1NGJCM2FERjM4MWYwNzAzMTExMzUxNzYzRTUxQUFiZTFDNjk0NzE2", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXhycmZlazNxcHo0amE4Y2NyamtsZnkwNjRhc3lxcTlrNzc4ZWp3", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFtcGU5cmRrN3ljdWpnZTdyOW5janQ0ZWthbWdyZGN5Z3Z6d3FlOA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjI0NDI0MzU2ODE1NDU1OTJ1YnRjLDMyMDcuMjUxODMwMjg2MTM4NDkwMjM1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgxMzE5MzUzNTc3dXNlaSwxLjAwMDAwOTU3ODM5MDUzMTY5OHV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXhycmZlazNxcHo0amE4Y2NyamtsZnkwNjRhc3lxcTlrNzc4ZWp3", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1fpvjye4rcqmds6vvrjvf4pl8jfsv5vkn0llaxs\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056536876589244999uosmo,0.127965771438187656usei,1.000001955486888759uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1s2gtk40ya9r9g35sayluasgyse2ckzkg6f492k\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXMyZ3RrNDB5YTlyOWczNXNheWx1YXNneXNlMmNremtnNmY0OTJr", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXMyZ3RrNDB5YTlyOWczNXNheWx1YXNneXNlMmNremtnNmY0OTJrLzkzMDY5MTY2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "TThQYVB5RkQyYmtXMXRrRXcxUWI1M1R0NXF3ODBKTkE0eWhEamptMHd4OHVLbmx4YkhYdi9PQThyWnVaQmJ6MHQ3RTdpRUhzejVQMnhVTkF2UkJaYXc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg0YzhENTdENzFkMTdFNWYxNDlhODNhODRGMDU5OWM4NzAwOWUyY0E5", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXMyZ3RrNDB5YTlyOWczNXNheWx1YXNneXNlMmNremtnNmY0OTJr", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFmcHZqeWU0cmNxbWRzNnZ2cmp2ZjRwbDhqZnN2NXZrbjBsbGF4cw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk1NTQ4Njg4ODc1OXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXMyZ3RrNDB5YTlyOWczNXNheWx1YXNneXNlMmNremtnNmY0OTJr", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1qe8uuf5x69c526h4nzxwv4ltftr73v7qnkypla\"},{\"key\":\"exchange_rates\",\"value\":\"2.374697747720361685uatom,94148.262940479195260214ubtc,3207.252223868421654292ueth,0.056538024542367039uosmo,0.127963028408679979usei,0.999969934548879947uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1yz354pg6a2d0qtawaty0wcfuau3axkjejymlfx\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXl6MzU0cGc2YTJkMHF0YXdhdHkwd2NmdWF1M2F4a2planltbGZ4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXl6MzU0cGc2YTJkMHF0YXdhdHkwd2NmdWF1M2F4a2planltbGZ4LzkyMzk4Nzgy", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "RHljS0pIb3RWemMrKzlPOEFJSytWdE5scjJkQjY2Y1kxeGhrR29abkxFNDhlc25IS21DOHBsNjNua0l4ZHM2VUpTcFZjOENvcnl6b1FVbG9ML2RuckE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg0QjkzM2U5Njc2N0M2YjdiRTM1MzBBY0Y2NDBGN0NEZDIxODYyN2U0", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXl6MzU0cGc2YTJkMHF0YXdhdHkwd2NmdWF1M2F4a2planltbGZ4", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFxZTh1dWY1eDY5YzUyNmg0bnp4d3Y0bHRmdHI3M3Y3cW5reXBsYQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ2OTc3NDc3MjAzNjE2ODV1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzODY4NDIxNjU0MjkydWV0aCwwLjA1NjUzODAyNDU0MjM2NzAzOXVvc21vLDAuMTI3OTYzMDI4NDA4Njc5OTc5dXNlaSwwLjk5OTk2OTkzNDU0ODg3OTk0N3V1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXl6MzU0cGc2YTJkMHF0YXdhdHkwd2NmdWF1M2F4a2planltbGZ4", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper14ts0j42qkpr43a3tgxr7zz6l6zdf7hde3mf2ae\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.261293325831966554ubtc,3207.252281463794049175ueth,0.056536876589244999uosmo,0.127965757152878967usei,1.000009485366537492uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1jx88fgfndly9gr93qf96apmeg5762hwtp4au92\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWp4ODhmZ2ZuZGx5OWdyOTNxZjk2YXBtZWc1NzYyaHd0cDRhdTky", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWp4ODhmZ2ZuZGx5OWdyOTNxZjk2YXBtZWc1NzYyaHd0cDRhdTkyLzg5OTA1OTAx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "SGhDT1kyTjIvTC9wbCt0UlgxdnZIZjc0ellDLzVCRUdMUS8ySFduR25OcENpU1c0TVcxT1ZLNy9NeVZobjdDc1cvYkpWMWh5STNTNm9oY3FEVzF4Smc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhhNzk0MUY1MEE0QWY5M2M2ZjVBRUZkNkMwRWEyNTFkMTMyQWVkZjM3", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWp4ODhmZ2ZuZGx5OWdyOTNxZjk2YXBtZWc1NzYyaHd0cDRhdTky", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE0dHMwajQycWtwcjQzYTN0Z3hyN3p6Nmw2emRmN2hkZTNtZjJhZQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjEyOTMzMjU4MzE5NjY1NTR1YnRjLDMyMDcuMjUyMjgxNDYzNzk0MDQ5MTc1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzU3MTUyODc4OTY3dXNlaSwxLjAwMDAwOTQ4NTM2NjUzNzQ5MnV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWp4ODhmZ2ZuZGx5OWdyOTNxZjk2YXBtZWc1NzYyaHd0cDRhdTky", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1xm0pjt3qsdlc6u4n7fjpycqd5h7zwla7tz8m37\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.262839130394574605ubtc,3207.252559662459322773ueth,0.056536876589244999uosmo,0.127965480350742837usei,1.000003232269243565uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei15pv8rmmtc23atu9zusfqdpc58z4y6jrtgptqfd\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTVwdjhybW10YzIzYXR1OXp1c2ZxZHBjNTh6NHk2anJ0Z3B0cWZk", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTVwdjhybW10YzIzYXR1OXp1c2ZxZHBjNTh6NHk2anJ0Z3B0cWZkLzgyNzc4Mzk4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "Uzgxd1d2ZWpPQWhTN1gxVWwxMkcrTW9TNGJHbnljSmtuZm1KSm9JVGVocHhhMitLTFZocVNwZFFERmJiQmpzK0kwUHlxVHRvQkkyejJ5YTVva0YxNWc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgyNjE1YjUxYkU0QmFkODA4MTVGYzhjNUQyNzhiMjBGNjhDODE5NTBm", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTVwdjhybW10YzIzYXR1OXp1c2ZxZHBjNTh6NHk2anJ0Z3B0cWZk", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF4bTBwanQzcXNkbGM2dTRuN2ZqcHljcWQ1aDd6d2xhN3R6OG0zNw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjI4MzkxMzAzOTQ1NzQ2MDV1YnRjLDMyMDcuMjUyNTU5NjYyNDU5MzIyNzczdWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NDgwMzUwNzQyODM3dXNlaSwxLjAwMDAwMzIzMjI2OTI0MzU2NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTVwdjhybW10YzIzYXR1OXp1c2ZxZHBjNTh6NHk2anJ0Z3B0cWZk", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1t9fq3qfm7ngau5gr8qgf5dpfzjqg79kf65cu04\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.262442435681545592ubtc,3207.251830286138490235ueth,0.056536876589244999uosmo,0.127965771438187656usei,1.000001943751074491uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei14n9fhykwk8rk7zln7rzd6uyhm2gzntuw2pv0e9\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTRuOWZoeWt3azhyazd6bG43cnpkNnV5aG0yZ3pudHV3MnB2MGU5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTRuOWZoeWt3azhyazd6bG43cnpkNnV5aG0yZ3pudHV3MnB2MGU5LzkyMjAwMzA5", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "dWlNWFR6SmFnaEE2cGFJdmh0L0ZCVWJ4bFRQbnFxVzRTbTYrQUw5akp0Y2grT3NqOXBSQjBBM0t0N0JCYU5hODBvSWZLSE14aGpVeksyQmVxenhWMWc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1ZjI0MTZFNzY4Y0NDNDI3MTkzMTk5NTdEYUQ2MUFjM2U1NWU0M0Ix", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTRuOWZoeWt3azhyazd6bG43cnpkNnV5aG0yZ3pudHV3MnB2MGU5", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF0OWZxM3FmbTduZ2F1NWdyOHFnZjVkcGZ6anFnNzlrZjY1Y3UwNA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjI0NDI0MzU2ODE1NDU1OTJ1YnRjLDMyMDcuMjUxODMwMjg2MTM4NDkwMjM1dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk0Mzc1MTA3NDQ5MXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTRuOWZoeWt3azhyazd6bG43cnpkNnV5aG0yZ3pudHV3MnB2MGU5", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper10c6rrz55ukkaf7rjeerhpxwpqel4tllzs8vgfq\"},{\"key\":\"exchange_rates\",\"value\":\"2.374707763107645190uatom,94148.263421207670719753ubtc,3207.252150477261911270ueth,0.056536698611783429uosmo,0.127965750554105634usei,1.000009471325848990uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1pwnqs47ymjft945dhvdm4vzga6qsphsw6shlex\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXB3bnFzNDd5bWpmdDk0NWRodmRtNHZ6Z2E2cXNwaHN3NnNobGV4", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXB3bnFzNDd5bWpmdDk0NWRodmRtNHZ6Z2E2cXNwaHN3NnNobGV4LzM3MDk2ODMx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "ZlptRkZDRjR2a29oS3Vwem0yRVZ2dWdPc2owZnRzaHJlV2wzMHVMM3p6OFdUcEVPUE9PRUZEd0RqV08wQ1QvYXpZL0VxUGNXUS96ME9weEcrdkY3Y3c9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhBNjA2YjRENTVENzMwMTgxNWNEREVFMEEwMDM3QTY4MzdhQTI0MjFC", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXB3bnFzNDd5bWpmdDk0NWRodmRtNHZ6Z2E2cXNwaHN3NnNobGV4", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjEwYzZycno1NXVra2FmN3JqZWVyaHB4d3BxZWw0dGxsenM4dmdmcQ==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDc3NjMxMDc2NDUxOTB1YXRvbSw5NDE0OC4yNjM0MjEyMDc2NzA3MTk3NTN1YnRjLDMyMDcuMjUyMTUwNDc3MjYxOTExMjcwdWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwOTQ3MTMyNTg0ODk5MHV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXB3bnFzNDd5bWpmdDk0NWRodmRtNHZ6Z2E2cXNwaHN3NnNobGV4", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1equ53z9m5mkzm5epmvp3qvhz770djygychug2v\"},{\"key\":\"exchange_rates\",\"value\":\"2.374706120466234723uatom,94148.263421207670719753ubtc,3207.252150477261911270ueth,0.056536876589244999uosmo,0.127965741026205442usei,1.000001963099734739uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1gxf6ep0x9tvlt6p07xavl9sshk8ln6u70dwmqu\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWd4ZjZlcDB4OXR2bHQ2cDA3eGF2bDlzc2hrOGxuNnU3MGR3bXF1", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWd4ZjZlcDB4OXR2bHQ2cDA3eGF2bDlzc2hrOGxuNnU3MGR3bXF1LzIwMjA5NTk=", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "WTBUdW1PYk5WNUtFMjZYWVYwMkRrYzVoY25XL2VIQjA4R21zdVh2UzMvdytGdFlTTTdmRzhtWFFvVFh0TlNBV1NqcXB5OHk5K2xNMklOZEcwM0hNRFE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgxYjE2NzhkMjIwNEZiRUI0QzM2YzdkRmYzNTE5NkEyMWVFQ2JDZDhl", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWd4ZjZlcDB4OXR2bHQ2cDA3eGF2bDlzc2hrOGxuNnU3MGR3bXF1", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFlcXU1M3o5bTVta3ptNWVwbXZwM3F2aHo3NzBkanlneWNodWcydg==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDYxMjA0NjYyMzQ3MjN1YXRvbSw5NDE0OC4yNjM0MjEyMDc2NzA3MTk3NTN1YnRjLDMyMDcuMjUyMTUwNDc3MjYxOTExMjcwdWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzQxMDI2MjA1NDQydXNlaSwxLjAwMDAwMTk2MzA5OTczNDczOXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWd4ZjZlcDB4OXR2bHQ2cDA3eGF2bDlzc2hrOGxuNnU3MGR3bXF1", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper17ga9jha45gu0x04yrmfpjpksmqe48wupzk5jex\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.261199905892492990ubtc,3207.251797029775146576ueth,0.056536876589244999uosmo,0.127965750554105634usei,1.000009202154658707uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1f9gy2u3sl4afd3qpqc59x2sdxma4tw67wv2k7v\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWY5Z3kydTNzbDRhZmQzcXBxYzU5eDJzZHhtYTR0dzY3d3Yyazd2", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWY5Z3kydTNzbDRhZmQzcXBxYzU5eDJzZHhtYTR0dzY3d3Yyazd2LzkyNjg1OTIy", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "WGhuQ29GYU1WRjBTMmZMWXBOdUVxY0dtVzkzNXNPMXUzZEUxQXRibWdIZ3FUa2xjUzVhVmVkeHZpaFpkaTJFZzZrTENSem1sdVFHZ2x6aFZPR1dMRUE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg4QTVlYkQwMTFCMDhkNzZhNThEODgzRDRBMThmOEFFZjQwMzk1RWJj", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWY5Z3kydTNzbDRhZmQzcXBxYzU5eDJzZHhtYTR0dzY3d3Yyazd2", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE3Z2E5amhhNDVndTB4MDR5cm1mcGpwa3NtcWU0OHd1cHprNWpleA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjExOTk5MDU4OTI0OTI5OTB1YnRjLDMyMDcuMjUxNzk3MDI5Nzc1MTQ2NTc2dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwOTIwMjE1NDY1ODcwN3V1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWY5Z3kydTNzbDRhZmQzcXBxYzU5eDJzZHhtYTR0dzY3d3Yyazd2", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper14u38cl6knqxs6vs7lj7vzfvap42yyc3runtrwc\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.261199905892492990ubtc,3207.251797029775146576ueth,0.056536876589244999uosmo,0.127965771438187656usei,1.000001955486888759uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei13u2zsyy8r3vq3g3cv0r2kdn94f400kdke3mu8c\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTN1MnpzeXk4cjN2cTNnM2N2MHIya2RuOTRmNDAwa2RrZTNtdThj", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTN1MnpzeXk4cjN2cTNnM2N2MHIya2RuOTRmNDAwa2RrZTNtdThjLzkyNzI2ODI1", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "ckhXM3BpeXR2TnY3elZiUG13MjBwUDVzMkVYS2xGWStFbHROaTZJQ2gxbG5LajBzSjk3OUl5MEJ5N0hoNlNpSlpnRktYWTVTY3RibzZjUFBRMjJUcnc9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhhNUU0MjU2OUM5MzIxZmIzZDg0NkNFZkY2MEQ1NjllMzREODU5NmQ1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTN1MnpzeXk4cjN2cTNnM2N2MHIya2RuOTRmNDAwa2RrZTNtdThj", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjE0dTM4Y2w2a25xeHM2dnM3bGo3dnpmdmFwNDJ5eWMzcnVudHJ3Yw==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjExOTk5MDU4OTI0OTI5OTB1YnRjLDMyMDcuMjUxNzk3MDI5Nzc1MTQ2NTc2dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk1NTQ4Njg4ODc1OXV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTN1MnpzeXk4cjN2cTNnM2N2MHIya2RuOTRmNDAwa2RrZTNtdThj", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1qmpxlswwk42wya67t7zsaawf3vur03cuevss0h\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223647628656390ueth,0.056536698611783429uosmo,0.127965771438187656usei,1.000001965184326252uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1z6rxdfe78mufvkdyz5k2pu8leh4mx2tf0u3wzr\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMXo2cnhkZmU3OG11ZnZrZHl6NWsycHU4bGVoNG14MnRmMHUzd3py", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMXo2cnhkZmU3OG11ZnZrZHl6NWsycHU4bGVoNG14MnRmMHUzd3pyLzEyMTIyNDg1", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "WjFZeHd4eEN4U0hwUXpKYzJ6VlRKVWNpTVZYQ0VYTDBUTkpsVkE3b0FoVlRkQy9ZSURmSHZTRkQyTG1NWlg4SVVlNWY2ZHFiUmNVYVBVMWtOWTdXY0E9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg3NzFhYTIwMTQzN0Q1YjNhNDgzZDY0Njg1QzIzZkZlNUE0YTAyNmJl", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXo2cnhkZmU3OG11ZnZrZHl6NWsycHU4bGVoNG14MnRmMHUzd3py", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFxbXB4bHN3d2s0Mnd5YTY3dDd6c2Fhd2YzdnVyMDNjdWV2c3MwaA==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzNjQ3NjI4NjU2MzkwdWV0aCwwLjA1NjUzNjY5ODYxMTc4MzQyOXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk2NTE4NDMyNjI1MnV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXo2cnhkZmU3OG11ZnZrZHl6NWsycHU4bGVoNG14MnRmMHUzd3py", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1y82m5y3wevjneamzg0pmx87dzanyxzht0kepvn\"},{\"key\":\"exchange_rates\",\"value\":\"2.374708838400241119uatom,94148.262940479195260214ubtc,3207.252223647628656390ueth,0.056536876589244999uosmo,0.127965771438187656usei,1.000001945815119900uusdc,0.999712288685022953uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei1f8ey877q8x84972dhhcd4jddrk46pxn7wua7yl\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMWY4ZXk4NzdxOHg4NDk3MmRoaGNkNGpkZHJrNDZweG43d3VhN3ls", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMWY4ZXk4NzdxOHg4NDk3MmRoaGNkNGpkZHJrNDZweG43d3VhN3lsLzc2NDg1MzQ3", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "WmdXWU9QZHpLZEFibm9Pb0Y0WDJrT2Y2L25hVk14ZDI0dVBtemVUVEF2bGNhcndOeEx4blFOWFJKM3FRKzRLU0lrZmgvcUdCbk1YSjB0K1pDMklWNVE9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg2NTc1ZWNFZmU3YTZFMUJhMzU1NTE0RDU5YUY4QzQ4NDIzNzY3NzU3", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWY4ZXk4NzdxOHg4NDk3MmRoaGNkNGpkZHJrNDZweG43d3VhN3ls", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjF5ODJtNXkzd2V2am5lYW16ZzBwbXg4N2R6YW55eHpodDBrZXB2bg==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDg4Mzg0MDAyNDExMTl1YXRvbSw5NDE0OC4yNjI5NDA0NzkxOTUyNjAyMTR1YnRjLDMyMDcuMjUyMjIzNjQ3NjI4NjU2MzkwdWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzcxNDM4MTg3NjU2dXNlaSwxLjAwMDAwMTk0NTgxNTExOTkwMHV1c2RjLDAuOTk5NzEyMjg4Njg1MDIyOTUzdXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMWY4ZXk4NzdxOHg4NDk3MmRoaGNkNGpkZHJrNDZweG43d3VhN3ls", + "index": true + } + ] + } + ] + }, + { + "data": "CjsKOS9zZWlwcm90b2NvbC5zZWljaGFpbi5vcmFjbGUuTXNnQWdncmVnYXRlRXhjaGFuZ2VSYXRlVm90ZQ==", + "log": "[{\"events\":[{\"type\":\"aggregate_vote\",\"attributes\":[{\"key\":\"voter\",\"value\":\"seivaloper1spg334qdsxtmlzqn9vsh566477wd0hr56cjspj\"},{\"key\":\"exchange_rates\",\"value\":\"2.374707097511016675uatom,94148.262839130394574605ubtc,3207.252559441713118576ueth,0.056536876589244999uosmo,0.127965750554105634usei,1.000009399177010465uusdc,0.999711144480739004uusdt\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.oracle.MsgAggregateExchangeRateVote\"},{\"key\":\"module\",\"value\":\"oracle\"},{\"key\":\"sender\",\"value\":\"sei18qn8rwdwmvzsj8gx3zjrgr7ur2vajf0e0swx4q\"}]}]}]", + "events": [ + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": null, + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMThxbjhyd2R3bXZ6c2o4Z3gzempyZ3I3dXIydmFqZjBlMHN3eDRx", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMThxbjhyd2R3bXZ6c2o4Z3gzempyZ3I3dXIydmFqZjBlMHN3eDRxLzkzMDM1OTY3", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "Qnk1NHlsMWY3L1BEY3JqQ0tRbmdvdFMyeEI1TVd1MTZPa3ozNjlOekJKaHRFTUl5anVWVm1pVWovTWxoc3ZDc1dpcmJmQUpnTldRK3E4OHBRcEpma0E9PQ==", + "index": true + } + ] + }, + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1QjNlNEM2REY0NDQ5MTJDNDE3Qzg3NzQwODUzNzRiZTg0ZmVmNDFC", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMThxbjhyd2R3bXZ6c2o4Z3gzempyZ3I3dXIydmFqZjBlMHN3eDRx", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLm9yYWNsZS5Nc2dBZ2dyZWdhdGVFeGNoYW5nZVJhdGVWb3Rl", + "index": true + } + ] + }, + { + "type": "aggregate_vote", + "attributes": [ + { + "key": "dm90ZXI=", + "value": "c2VpdmFsb3BlcjFzcGczMzRxZHN4dG1senFuOXZzaDU2NjQ3N3dkMGhyNTZjanNwag==", + "index": true + }, + { + "key": "ZXhjaGFuZ2VfcmF0ZXM=", + "value": "Mi4zNzQ3MDcwOTc1MTEwMTY2NzV1YXRvbSw5NDE0OC4yNjI4MzkxMzAzOTQ1NzQ2MDV1YnRjLDMyMDcuMjUyNTU5NDQxNzEzMTE4NTc2dWV0aCwwLjA1NjUzNjg3NjU4OTI0NDk5OXVvc21vLDAuMTI3OTY1NzUwNTU0MTA1NjM0dXNlaSwxLjAwMDAwOTM5OTE3NzAxMDQ2NXV1c2RjLDAuOTk5NzExMTQ0NDgwNzM5MDA0dXVzZHQ=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "b3JhY2xl", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMThxbjhyd2R3bXZ6c2o4Z3gzempyZ3I3dXIydmFqZjBlMHN3eDRx", + "index": true + } + ] + } + ] + }, + { + "data": "CqEmCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEvElCO7HFRogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuDagiQjB4NzZiNzQyYTdjMmI5MThmMGFhMjUyNmY5MjNkZDk0NzVkZGQwNmM5MTJkMDBjNjk4OGE4MTk3NGU2YzY0ZTgyNSqaAgoqMHg5MTUxNDM0YjE2Yjk3NjM2NjA3MDU3NDQ4OTFmQTkwNkY2NjBFY0M1EkIweGRkZjI1MmFkMWJlMmM4OWI2OWMyYjA2OGZjMzc4ZGFhOTUyYmE3ZjE2M2M0YTExNjI4ZjU1YTRkZjUyM2IzZWYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZjYyYmQ1MjVlODI1NzdhMTYyZGU4OGJkNzBkZTAzMmE2MjY3NTIzNxJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZGViMzA1NDU2NTFlYTY0MDJiYjU4NTI4ODNhNWYzNzg5OGVlYWVhGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm4epiqcAgoqMHhlMTVmQzM4RjZEOGM1NmFGMDdiYkNCZTNCQWY1NzA4QTJCZjQyMzkyEkIweGRkZjI1MmFkMWJlMmM4OWI2OWMyYjA2OGZjMzc4ZGFhOTUyYmE3ZjE2M2M0YTExNjI4ZjU1YTRkZjUyM2IzZWYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmRlYjMwNTQ1NjUxZWE2NDAyYmI1ODUyODgzYTVmMzc4OThlZWFlYRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmNjJiZDUyNWU4MjU3N2ExNjJkZTg4YmQ3MGRlMDMyYTYyNjc1MjM3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm4DhSABKp0DCioweGY2MkJENTI1RTgyNTc3YTE2MkRFODhiRDcwZEUwMzJhNjI2NzUyMzcSQjB4YzQyMDc5Zjk0YTYzNTBkN2U2MjM1ZjI5MTc0OTI0ZjkyOGNjMmFjODE4ZWI2NGZlZDgwMDRlMTE1ZmJjY2E2NxJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZGViMzA1NDU2NTFlYTY0MDJiYjU4NTI4ODNhNWYzNzg5OGVlYWVhEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJkZWIzMDU0NTY1MWVhNjQwMmJiNTg1Mjg4M2E1ZjM3ODk4ZWVhZWEaoAH//////////////////////////////////////ZHhWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbgOFAAAAAAAAAAAAAAAAAAAAAAAAAAD/9ySPDVKEPk3PcD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlGW8+5ts//////////////////////////////////////////9IAIqnAIKKjB4RTMwZmVEZDE1OEEyZTNiMTNlOWJhZGFlQUJhRmM1NTE2ZTk1ZThDNxJCMHhkZGYyNTJhZDFiZTJjODliNjljMmIwNjhmYzM3OGRhYTk1MmJhN2YxNjNjNGExMTYyOGY1NWE0ZGY1MjNiM2VmEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGIyNDMzMjBiY2Y5Yzk1ZGI3Zjc0MTA4YjY3NzNiOGY0ZGMzYWRhZjUSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmRlYjMwNTQ1NjUxZWE2NDAyYmI1ODUyODgzYTVmMzc4OThlZWFlYRogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARR1A01pPZhyQgAyqcAgoqMHg5MTUxNDM0YjE2Yjk3NjM2NjA3MDU3NDQ4OTFmQTkwNkY2NjBFY0M1EkIweGRkZjI1MmFkMWJlMmM4OWI2OWMyYjA2OGZjMzc4ZGFhOTUyYmE3ZjE2M2M0YTExNjI4ZjU1YTRkZjUyM2IzZWYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmRlYjMwNTQ1NjUxZWE2NDAyYmI1ODUyODgzYTVmMzc4OThlZWFlYRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBiMjQzMzIwYmNmOWM5NWRiN2Y3NDEwOGI2NzczYjhmNGRjM2FkYWY1GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm4epiAEKp0DCioweGIyNDMzMjBiY2Y5Yzk1REI3Rjc0MTA4QjY3NzNiOEY0RGMzYWRhRjUSQjB4YzQyMDc5Zjk0YTYzNTBkN2U2MjM1ZjI5MTc0OTI0ZjkyOGNjMmFjODE4ZWI2NGZlZDgwMDRlMTE1ZmJjY2E2NxJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZGViMzA1NDU2NTFlYTY0MDJiYjU4NTI4ODNhNWYzNzg5OGVlYWVhEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJkZWIzMDU0NTY1MWVhNjQwMmJiNTg1Mjg4M2E1ZjM3ODk4ZWVhZWEaoAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm4epv//////////////////////////////7rivyylsJnjcAAAAAAAAAAAAAAAAAAAAAAAquiqKeAmrfoE07+6XzPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIq4v9DMCk8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIfWIAUqnAIKKjB4ZTE1ZkMzOEY2RDhjNTZhRjA3YmJDQmUzQkFmNTcwOEEyQmY0MjM5MhJCMHhkZGYyNTJhZDFiZTJjODliNjljMmIwNjhmYzM3OGRhYTk1MmJhN2YxNjNjNGExMTYyOGY1NWE0ZGY1MjNiM2VmEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzOGFhYzYwZTFkMTdjZTIyMjk4MTJlY2E4ZWU3ODAwMjE0YmFmZmMSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmRlYjMwNTQ1NjUxZWE2NDAyYmI1ODUyODgzYTVmMzc4OThlZWFlYRogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuDaggBiqcAgoqMHhFMzBmZURkMTU4QTJlM2IxM2U5YmFkYWVBQmFGYzU1MTZlOTVlOEM3EkIweGRkZjI1MmFkMWJlMmM4OWI2OWMyYjA2OGZjMzc4ZGFhOTUyYmE3ZjE2M2M0YTExNjI4ZjU1YTRkZjUyM2IzZWYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmRlYjMwNTQ1NjUxZWE2NDAyYmI1ODUyODgzYTVmMzc4OThlZWFlYRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzhhYWM2MGUxZDE3Y2UyMjI5ODEyZWNhOGVlNzgwMDIxNGJhZmZjGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFH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", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1j36cw8uyrpf34kdq6h0amhdhsetq5760l7lqs4\"},{\"key\":\"amount\",\"value\":\"25228usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqql4qzr88\"},{\"key\":\"amount\",\"value\":\"7771usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1j36cw8uyrpf34kdq6h0amhdhsetq5760l7lqs4\"},{\"key\":\"amount\",\"value\":\"236000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqql4qzr88\"},{\"key\":\"amount\",\"value\":\"764000000000\"}]}]}]", + "gas_wanted": 1500000, + "gas_used": 353262, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgzRmZFQUYxNkFmYjQ0MDdjYTk5Zjg3ZWQzMjFCYTBDNDEyNTdEQjEw", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWozNmN3OHV5cnBmMzRrZHE2aDBhbWhkaHNldHE1NzYwbDdscXM0", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWozNmN3OHV5cnBmMzRrZHE2aDBhbWhkaHNldHE1NzYwbDdscXM0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzMwMDB1c2Vp", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWozNmN3OHV5cnBmMzRrZHE2aDBhbWhkaHNldHE1NzYwbDdscXM0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjUyMjh1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWozNmN3OHV5cnBmMzRrZHE2aDBhbWhkaHNldHE1NzYwbDdscXM0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjM2MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Nzc3MXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NzY0MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x3FfEAF16Afb4407ca99f87ed321Ba0C41257DB10", + "nonce": 266566, + "txHash": "0x76b742a7c2b918f0aa2526f923dd9475ddd06c912d00c6988a81974e6c64e825" + } + }, + { + "data": "Cu0ECisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEr0ECPLnqwIiQjB4OGQ0NzAxMGZlYzY0YTk4N2U0YmIwM2IzNTg3ODI0MDRhNDQwNTU5NmVlZTkwYjZhOTc2ZjJlNjYzODNlNDg1YyrSAQoqMHgwZDc0MkE5QjRENzY2RTI1NmYwQzdEZDViQkU4MzIzMzc4MjdiZWI3EkIweDFmMmQxYTlmZGUwNTNhZjQ2YjVkYjNkYzkyYThhYTg2OTZlNTZhNjc3OTk4ZmRkMTMxMWI0NWJlMzQxZjc4NTMaYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpXAeRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAAAAxHGjSwierNLTF0lTeIlSxlSqcAgoqMHgwZDc0MkE5QjRENzY2RTI1NmYwQzdEZDViQkU4MzIzMzc4MjdiZWI3EkIweDU2YzU0YmE5YmQzOGQ4ZmQ2MjAxMmU0MmM3ZWU1NjQ1MTliMDk3NjNjNDI2ZDMzMWIzNjYxYjUzN2VhZDE5YjISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjNiOWYyNTE0OGNjYzUzMzdmMGE4ODllOGIzZjBmOGM5MTMwYzJmYRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2M2I5ZjI1MTQ4Y2NjNTMzN2YwYTg4OWU4YjNmMGY4YzkxMzBjMmZhGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAB", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei102hfhdscqs383vr6cuukz3hkujp6le44p3mdnz\"},{\"key\":\"amount\",\"value\":\"598usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpqs3kax2\"},{\"key\":\"amount\",\"value\":\"58945usei\"}]},{\"type\":\"cw721_pretransfer_owner\",\"attributes\":[{\"key\":\"_contract_address\",\"value\":\"sei1wzhrqprfpxagkrxz9fspmnrtc0fqusk5g6ynpezcl705sfqs55nqscej0k\"},{\"key\":\"token_id\",\"value\":\"1663\"},{\"key\":\"owner\",\"value\":\"sei1p46z4x6dwehz2mcv0h2mh6pjxduz004hn9nxv3\"}]},{\"type\":\"execute\",\"attributes\":[{\"key\":\"_contract_address\",\"value\":\"sei1wzhrqprfpxagkrxz9fspmnrtc0fqusk5g6ynpezcl705sfqs55nqscej0k\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wasm\",\"attributes\":[{\"key\":\"_contract_address\",\"value\":\"sei1wzhrqprfpxagkrxz9fspmnrtc0fqusk5g6ynpezcl705sfqs55nqscej0k\"},{\"key\":\"action\",\"value\":\"transfer_nft\"},{\"key\":\"sender\",\"value\":\"sei1p46z4x6dwehz2mcv0h2mh6pjxduz004hn9nxv3\"},{\"key\":\"recipient\",\"value\":\"sei102hfhdscqs383vr6cuukz3hkujp6le44p3mdnz\"},{\"key\":\"token_id\",\"value\":\"1663\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei102hfhdscqs383vr6cuukz3hkujp6le44p3mdnz\"},{\"key\":\"amount\",\"value\":\"860000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpqs3kax2\"},{\"key\":\"amount\",\"value\":\"368000000000\"}]}]}]", + "gas_wanted": 4962019, + "gas_used": 4912214, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg2M2I5ZjI1MTQ4Y2NjNTMzN0YwYTg4OUU4QjNmMGY4YzkxMzBjMmZB", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTk1NDR1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjI4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "cw721_pretransfer_owner", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXd6aHJxcHJmcHhhZ2tyeHo5ZnNwbW5ydGMwZnF1c2s1ZzZ5bnBlemNsNzA1c2ZxczU1bnFzY2VqMGs=", + "index": true + }, + { + "key": "dG9rZW5faWQ=", + "value": "MTY2Mw==", + "index": true + }, + { + "key": "b3duZXI=", + "value": "c2VpMXA0Nno0eDZkd2VoejJtY3YwaDJtaDZwanhkdXowMDRobjlueHYz", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXd6aHJxcHJmcHhhZ2tyeHo5ZnNwbW5ydGMwZnF1c2s1ZzZ5bnBlemNsNzA1c2ZxczU1bnFzY2VqMGs=", + "index": true + } + ] + }, + { + "type": "wasm", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXd6aHJxcHJmcHhhZ2tyeHo5ZnNwbW5ydGMwZnF1c2s1ZzZ5bnBlemNsNzA1c2ZxczU1bnFzY2VqMGs=", + "index": true + }, + { + "key": "YWN0aW9u", + "value": "dHJhbnNmZXJfbmZ0", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXA0Nno0eDZkd2VoejJtY3YwaDJtaDZwanhkdXowMDRobjlueHYz", + "index": true + }, + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + }, + { + "key": "dG9rZW5faWQ=", + "value": "MTY2Mw==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTk4dXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTAyaGZoZHNjcXMzODN2cjZjdXVrejNoa3VqcDZsZTQ0cDNtZG56", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODYwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTg5NDV1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzY4MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x63b9f25148ccc5337F0a889E8B3f0f8c9130c2fA", + "nonce": 341, + "txHash": "0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c" + } + }, + { + "data": "CncKKy9zZWlwcm90b2NvbC5zZWljaGFpbi5ldm0uTXNnRVZNVHJhbnNhY3Rpb24SSAiIpAEiQjB4YzAxMTc0MDBiYjM3NTI1OTA1ZDhjMTdkYTY0MTM4NTM4ZWM0NGRkZWM3Yjk0YWNlOWVmOGZjNzA4OTQxMTA2Yw==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1jefn2z2um4uvlcgz8haug5pxrky0fru8xr78ed\"},{\"key\":\"amount\",\"value\":\"462usei\"},{\"key\":\"receiver\",\"value\":\"sei12h70786dcrdeg7g78phjydyqdllfwppfs8enpu\"},{\"key\":\"amount\",\"value\":\"12usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqppd8zgmc\"},{\"key\":\"amount\",\"value\":\"252usei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei12h70786dcrdeg7g78phjydyqdllfwppfs8enpu\"},{\"key\":\"amount\",\"value\":\"462usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1jefn2z2um4uvlcgz8haug5pxrky0fru8xr78ed\"},{\"key\":\"amount\",\"value\":\"49200000000\"},{\"key\":\"receiver\",\"value\":\"sei12h70786dcrdeg7g78phjydyqdllfwppfs8enpu\"},{\"key\":\"amount\",\"value\":\"600000000000\"}]},{\"type\":\"wei_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei12h70786dcrdeg7g78phjydyqdllfwppfs8enpu\"},{\"key\":\"amount\",\"value\":\"49200000000\"}]}]}]", + "gas_wanted": 22050, + "gas_used": 21000, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhCMjAwZDhlMzE5MmRlYTQ4YjhlNzgxMzAzRDc0MDQ1N0FDNDJlQmE1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjY0dXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDYydXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDkyMDAwMDAwMDA=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWplZm4yejJ1bTR1dmxjZ3o4aGF1ZzVweHJreTBmcnU4eHI3OGVk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDYydXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWplZm4yejJ1bTR1dmxjZ3o4aGF1ZzVweHJreTBmcnU4eHI3OGVk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDkyMDAwMDAwMDA=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTJ1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTJoNzA3ODZkY3JkZWc3Zzc4cGhqeWR5cWRsbGZ3cHBmczhlbnB1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBwZDh6Z21j", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjUydXNlaQ==", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xB200d8e3192dea48b8e781303D740457AC42eBa5", + "nonce": 2, + "txHash": "0xc0117400bb37525905d8c17da64138538ec44ddec7b94ace9ef8fc708941106c" + } + }, + { + "data": "CtECCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEqECCJ/bASJCMHhkMmE3ODNjNGRiZjY5MjFkNjZiNzZlMjFlNjQ4YmQwMGJkMjQ1MjA5OWE5ZDU4NzFmZDM4Y2JlYTEwMjMxM2ExKtYBCioweDJkRWVDRjJhMDVGNzM1ODkwRWIzZUEwODVkNTVDRWM4RjFhOTM4OTUSQjB4YjVkM2EyMDI3OGRjZWM0OTZlNGIwZDU2NWM5YjAxODljMzkwMGQxMzQxMGUyM2IyYjIyZWU4MzAxNmEzZmNmOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MWM3YTliZDcyYzMyMzVkMTI1MmMzNmM3MGYxZjIzOGNkYmUxMGM0GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaVwHkQ==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1ytrmge4vg8ljr7p89l6alvwclmc8gt6tfar79t\"},{\"key\":\"amount\",\"value\":\"3usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpzr5h748\"},{\"key\":\"amount\",\"value\":\"308usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1ytrmge4vg8ljr7p89l6alvwclmc8gt6tfar79t\"},{\"key\":\"amount\",\"value\":\"806000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpzr5h748\"},{\"key\":\"amount\",\"value\":\"693000000000\"}]}]}]", + "gas_wanted": 28409, + "gas_used": 28063, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg4MWM3YTliRDcyYzMyMzVkMTI1MmMzNmM3MEYxZjIzOGNEYmUxMEM0", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXl0cm1nZTR2ZzhsanI3cDg5bDZhbHZ3Y2xtYzhndDZ0ZmFyNzl0", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXl0cm1nZTR2ZzhsanI3cDg5bDZhbHZ3Y2xtYzhndDZ0ZmFyNzl0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzEydXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXl0cm1nZTR2ZzhsanI3cDg5bDZhbHZ3Y2xtYzhndDZ0ZmFyNzl0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDk5MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXl0cm1nZTR2ZzhsanI3cDg5bDZhbHZ3Y2xtYzhndDZ0ZmFyNzl0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXl0cm1nZTR2ZzhsanI3cDg5bDZhbHZ3Y2xtYzhndDZ0ZmFyNzl0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODA2MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzA4dXNlaQ==", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjkzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x81c7a9bD72c3235d1252c36c70F1f238cDbe10C4", + "nonce": 337, + "txHash": "0xd2a783c4dbf6921d66b76e21e648bd00bd2452099a9d5871fd38cbea102313a1" + } + }, + { + "data": "CtUGCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEqUGCKj2CSJCMHhhZjkxNTY2ODUxMmU3OTYyNmIzZDBmYzdjNjc4MmMzODdiODA5YTdmYzIzODJiYzM4MjJmYWJmMTczMTI1NTYzKtcCCioweDA1MDFhN2FGM0ExYzQ0N2M0MTFBNzFmMjkyQzc3YmU4ODEyRjZBNjgSQjB4NmJiN2ZmNzA4NjE5YmEwNjEwY2JhMjk1YTU4NTkyZTA0NTFkZWUyNjIyOTM4Yzg3NTU2Njc2ODhkYWYzNTI5YhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0GqABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASWlwZnM6Ly9iYWZ5YmVpaGlmeno1bWZ6b2w3N2RtdG51ZHppZWVqb2VqYXI1YXlxbDZoYzNhN200bG5lcGUyZjd5cS80Lmpzb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqAAwoqMHgwNTAxYTdhRjNBMWM0NDdjNDExQTcxZjI5MkM3N2JlODgxMkY2QTY4EkIweGMzZDU4MTY4YzVhZTczOTc3MzFkMDYzZDViYmYzZDY1Nzg1NDQyNzM0M2Y0YzA4MzI0MGY3YWFjYWEyZDBmNjISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZiYmVhN2I4Y2Y1MWFhMDU1MDE0OWEwZDEyYTBkMzlmMjQzNGFjOWMaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAQ==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1t45402j9alxjjzlzmhx9nzhg00v0lgwcej5p4s\"},{\"key\":\"amount\",\"value\":\"54usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpr7zrtg4\"},{\"key\":\"amount\",\"value\":\"1788usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1t45402j9alxjjzlzmhx9nzhg00v0lgwcej5p4s\"},{\"key\":\"amount\",\"value\":\"87000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpr7zrtg4\"},{\"key\":\"amount\",\"value\":\"600000000000\"}]}]}]", + "gas_wanted": 167517, + "gas_used": 162600, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhmQkJFYTdiOGNGNTFBYTA1NTAxNDlBMGQxMkEwZDM5ZjI0MzRBYzlj", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXQ0NTQwMmo5YWx4amp6bHptaHg5bnpoZzAwdjBsZ3djZWo1cDRz", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXQ0NTQwMmo5YWx4amp6bHptaHg5bnpoZzAwdjBsZ3djZWo1cDRz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTg0MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXQ0NTQwMmo5YWx4amp6bHptaHg5bnpoZzAwdjBsZ3djZWo1cDRz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Njg3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0NTQwMmo5YWx4amp6bHptaHg5bnpoZzAwdjBsZ3djZWo1cDRz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTR1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0NTQwMmo5YWx4amp6bHptaHg5bnpoZzAwdjBsZ3djZWo1cDRz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODcwMDAwMDAwMDA=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTc4OHVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xfBBEa7b8cF51Aa0550149A0d12A0d39f2434Ac9c", + "nonce": 120, + "txHash": "0xaf915668512e79626b3d0fc7c6782c387b809a7fc2382bc3822fabf173125563" + } + }, + { + "code": 45, + "data": "CosBCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uElwIk/8aEhJleGVjdXRpb24gcmV2ZXJ0ZWQiQjB4YWEwNjc4YjY4ZWY3OWQ4ODI1ZGY4ZjQ0MDZlMDE1ODM5MzNkMWM2NTlhOGMzNGYxZDFkNzcyNTg2ZDQwZTE2Yw==", + "log": "execution reverted: evm reverted", + "gas_wanted": 1000000, + "gas_used": 442259, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgwMGU2NTU2MmRDNjgwNUY5RUYyMEEzRjg0ZGQ5OTBFQjc0MzBBOGYx", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXphcjRuNHBybWVjbHZzeGp4bTJnbnl2ZGVta3N4djhxNzYwNzVr", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXphcjRuNHBybWVjbHZzeGp4bTJnbnl2ZGVta3N4djhxNzYwNzVr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDB1c2Vp", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXphcjRuNHBybWVjbHZzeGp4bTJnbnl2ZGVta3N4djhxNzYwNzVr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjEzNXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXphcjRuNHBybWVjbHZzeGp4bTJnbnl2ZGVta3N4djhxNzYwNzVr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTUxMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg2NHVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODQ5MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "codespace": "sdk", + "evm_tx_info": { + "senderAddress": "0x00e65562dC6805F9EF20A3F84dd990EB7430A8f1", + "nonce": 172408, + "txHash": "0xaa0678b68ef79d8825df8f4406e01583933d1c659a8c34f1d1d772586d40e16c", + "vmError": "execution reverted" + } + }, + { + "data": "Co0HCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEt0GCO+ZBxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHDeTfggAAiQjB4YTI2YzRjY2EyMGU2MmViMjM0ZjdkOTJlODhiYTQ5ZDkwMzhlYzBjYTg1ZTg5YzNmN2ExMmJmYzAzNWQxNmMzYSrWAQoqMHhEOTgzNGQ3Y2FBMkFDZjgxQzQwZTdBQUM2NDVDZjlhNTdjYjE0YmNkEkIweDFiYmY1NWQ0ODM2MzlmODEwM2RjNGUwMzVhZjcxYTRmYmRiMTZjODBiZTc0MGZhM2VlZjgxMTk4YWNlZmEwOTQSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHDeTfggAAqvAIKKjB4RDk4MzRkN2NhQTJBQ2Y4MUM0MGU3QUFDNjQ1Q2Y5YTU3Y2IxNGJjZBJCMHg2OWE4YzgwOWU1ODMxMGQxOTk1OTA1NjQwYWIzZDFlOGVmZTJjYTc3MmMyMTQzMmE2OTNkYTY5OTEyYTQ3OGYxEkIweDllMzUzMDhlMTI0ZTZkNmM1ODNlNDdhOGMxYWQyY2E3ODMyNmMwZDhmZDIzZGQzMWE4ZWY4YTA2NjA1ZjgyNTISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4soAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABKtgBCioweEQ5ODM0ZDdjYUEyQUNmODFDNDBlN0FBQzY0NUNmOWE1N2NiMTRiY2QSQjB4NTljNzlkNzliZTBmYWRmNTlmZTY4OWI2OTUyYjdlYmU5MDIwMWEzYTFmMDBkNGEzMTk4MjM3Nzg5MGJjNjA0NhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YmEwNzYxZmY2NDQ1NjA1MjliMGY1NDM2MmM4ZjYwMjQxNzU5MjhiGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcN5N+CAACAC", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1tws8v8lkg3tq22ds74pk9j8kqfqhty5tms3pqr\"},{\"key\":\"amount\",\"value\":\"5000usei\"},{\"key\":\"receiver\",\"value\":\"sei1xwf0alcxhnemec6sw46zgrfk6q2n7yfwauqy6a\"},{\"key\":\"amount\",\"value\":\"5000usei\"},{\"key\":\"receiver\",\"value\":\"sei1xwf0alcxhnemec6sw46zgrfk6q2n7yfwauqy6a\"},{\"key\":\"amount\",\"value\":\"10143usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp9zdqw5z\"},{\"key\":\"amount\",\"value\":\"1356usei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1mxp56l929t8cr3qw02kxgh8e547tzj7du9pgeq\"},{\"key\":\"amount\",\"value\":\"5000usei\"},{\"key\":\"spender\",\"value\":\"sei1tws8v8lkg3tq22ds74pk9j8kqfqhty5tms3pqr\"},{\"key\":\"amount\",\"value\":\"5000usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1xwf0alcxhnemec6sw46zgrfk6q2n7yfwauqy6a\"},{\"key\":\"amount\",\"value\":\"11500000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp9zdqw5z\"},{\"key\":\"amount\",\"value\":\"988500000000\"}]}]}]", + "gas_wanted": 1000000, + "gas_used": 117999, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhhYTdiZjQzYzZhMjZCRDdGMTc3MTg0NDRFMUY4OGZiYjRhNzhhRmFh", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXh3ZjBhbGN4aG5lbWVjNnN3NDZ6Z3JmazZxMm43eWZ3YXVxeTZh", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXh3ZjBhbGN4aG5lbWVjNnN3NDZ6Z3JmazZxMm43eWZ3YXVxeTZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTE1MDB1c2Vp", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMW14cDU2bDkyOXQ4Y3IzcXcwMmt4Z2g4ZTU0N3R6ajdkdTlwZ2Vx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTAwMHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXR3czh2OGxrZzN0cTIyZHM3NHBrOWo4a3FmcWh0eTV0bXMzcHFy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTAwMHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXR3czh2OGxrZzN0cTIyZHM3NHBrOWo4a3FmcWh0eTV0bXMzcHFy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTAwMHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXh3ZjBhbGN4aG5lbWVjNnN3NDZ6Z3JmazZxMm43eWZ3YXVxeTZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTAwMHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXh3ZjBhbGN4aG5lbWVjNnN3NDZ6Z3JmazZxMm43eWZ3YXVxeTZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAxNDN1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXh3ZjBhbGN4aG5lbWVjNnN3NDZ6Z3JmazZxMm43eWZ3YXVxeTZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTE1MDAwMDAwMDA=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTM1NnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTg4NTAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xaa7bf43c6a26BD7F17718444E1F88fbb4a78aFaa", + "nonce": 1847715, + "txHash": "0xa26c4cca20e62eb234f7d92e88ba49d9038ec0ca85e89c3f7a12bfc035d16c3a" + } + }, + { + "data": "Cv8ICisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEs8ICIS+CCJCMHg4MTM4ZTA0N2Y3MGY3YTc1MDc3MTAzZDU5YzE5YTY2ZDQ0MjhiZjRmMTUwNjBhZWQzZGNkNDQzMjU3N2FiOGQ3KnAKKjB4NUZGMTM3RDRiMEZEQ0Q0OURjQTMwYzdDRjU3RTU3OGEwMjZkMjc4ORJCMHhiYjQ3ZWUzZTE4M2E1NThiMWEyZmYwODc0YjA3OWYzZmM1NDc4Yjc0NTRlYWNmMmJmYzVhZjJmZjU4NzhmOTcyKrYBCioweEI5QTQwQjAyODkyMTA1NTJGMTk1RjBiNmZiOGZhNmNGMmQzMDcyMzcSQjB4MjBiYTUwOGRiOTVhYjE0OTc0MDhiMGRjNWJmNGJlNWNmMDQ5YWY2ZWFlYmViYjliYzQyOTQ3N2JmZjVjNTc5NBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjMzliMDlhMmNkOTBiNzM1ZjA4NGRkNDk0ZDMxNTJlZDg4NWFiMDA4IAEqlQIKKjB4YjJhQTM1MTFBMzEzMjdkNDdENTYyYzI5MkQ4QjQ0NUE5MDBCMkFCZhJCMHgyMzI5OWFjYTJjODU3YTM0OWU0N2NjN2M2MjU0MzIwN2UyM2ZjMjFiZWE5YmU2OTQ4OGNlMmViOTAwOTVhY2RjGqABlscx4gJMQ87o7tJrAkOeioDA0lRMGpoMLnW6PwTuJKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dGVhbV9jbWZjMHBmdWswZThrY2owa2l0NTJtZWkyLXByal9jbWZjMHl2ZWwwZTloY2owa2pmOXY3aHhnAAAAACACKsEDCioweDVGRjEzN0Q0YjBGRENENDlEY0EzMGM3Q0Y1N0U1NzhhMDI2ZDI3ODkSQjB4NDk2MjhmZDE0NzEwMDZjMTQ4MmRhODgwMjhlOWNlNGRiYjA4MGI4MTVjOWIwMzQ0ZDM5ZTVhOGU2ZWMxNDE5ZhJCMHg5NmM3MzFlMjAyNGM0M2NlZThlZWQyNmIwMjQzOWU4YTgwYzBkMjU0NGMxYTlhMGMyZTc1YmEzZjA0ZWUyNGE3EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGMzOWIwOWEyY2Q5MGI3MzVmMDg0ZGQ0OTRkMzE1MmVkODg1YWIwMDgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYjJhYTM1MTFhMzEzMjdkNDdkNTYyYzI5MmQ4YjQ0NWE5MDBiMmFiZhqAAVIjYhpjGbzjyDQ58nN2tbC5vGIFJeWX3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwv5CNZRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApbKIAM=", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17adfsd9fdlpegnhkumhrfkptlhgrgtp2090zq8\"},{\"key\":\"amount\",\"value\":\"1983usei\"},{\"key\":\"receiver\",\"value\":\"sei17adfsd9fdlpegnhkumhrfkptlhgrgtp2090zq8\"},{\"key\":\"amount\",\"value\":\"4952usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpxv74c6a\"},{\"key\":\"amount\",\"value\":\"1570usei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"1983usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17adfsd9fdlpegnhkumhrfkptlhgrgtp2090zq8\"},{\"key\":\"amount\",\"value\":\"489060000000\"},{\"key\":\"receiver\",\"value\":\"sei17adfsd9fdlpegnhkumhrfkptlhgrgtp2090zq8\"},{\"key\":\"amount\",\"value\":\"360600000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpxv74c6a\"},{\"key\":\"amount\",\"value\":\"835600000000\"}]},{\"type\":\"wei_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"489060000000\"}]}]}]", + "gas_wanted": 577274, + "gas_used": 139012, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhFRUY3MmIwNTA2MDdGNjU4NzYxOWQxOThDNGUyNDY4NWFhNWE4QjZC", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjUyM3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk2MjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDk1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdhZGZzZDlmZGxwZWduaGt1bWhyZmtwdGxoZ3JndHAyMDkwenE4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzYwNjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODM1NjAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xEEF72b050607F6587619d198C4e24685aa5a8B6B", + "nonce": 297982, + "txHash": "0x8138e047f70f7a75077103d59c19a66d4428bf4f15060aed3dcd4432577ab8d7" + } + }, + { + "data": "Cv8ICisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEs8ICJC+CCJCMHg5NjQ4NDhjMzY4NjY2NWFkMDhkOWRlZWRjMmVmMTA5NzY1NTdmMjhiMjVmZTMzODdkNGE3MjgxZmQ3YjRhOWRjKnAKKjB4NUZGMTM3RDRiMEZEQ0Q0OURjQTMwYzdDRjU3RTU3OGEwMjZkMjc4ORJCMHhiYjQ3ZWUzZTE4M2E1NThiMWEyZmYwODc0YjA3OWYzZmM1NDc4Yjc0NTRlYWNmMmJmYzVhZjJmZjU4NzhmOTcyKrYBCioweEI5QTQwQjAyODkyMTA1NTJGMTk1RjBiNmZiOGZhNmNGMmQzMDcyMzcSQjB4MjBiYTUwOGRiOTVhYjE0OTc0MDhiMGRjNWJmNGJlNWNmMDQ5YWY2ZWFlYmViYjliYzQyOTQ3N2JmZjVjNTc5NBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBiNmQ0MjkzMjI4ZjgzODQ3YWY5MmY1NzgyYjllYjVlMjY3Njk4MzJkIAEqlQIKKjB4YjJhQTM1MTFBMzEzMjdkNDdENTYyYzI5MkQ4QjQ0NUE5MDBCMkFCZhJCMHgyMzI5OWFjYTJjODU3YTM0OWU0N2NjN2M2MjU0MzIwN2UyM2ZjMjFiZWE5YmU2OTQ4OGNlMmViOTAwOTVhY2RjGqABjaFcj2q8UixWbaQ+VLJjDEUd7agRwh0xgYn/gGe3htsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dGVhbV9jbWZjMHBmdWswZThrY2owa2l0NTJtZWkyLXByal9jbWZjMHl2ZWwwZTloY2owa2pmOXY3aHhnAAAAACACKsEDCioweDVGRjEzN0Q0YjBGRENENDlEY0EzMGM3Q0Y1N0U1NzhhMDI2ZDI3ODkSQjB4NDk2MjhmZDE0NzEwMDZjMTQ4MmRhODgwMjhlOWNlNGRiYjA4MGI4MTVjOWIwMzQ0ZDM5ZTVhOGU2ZWMxNDE5ZhJCMHg4ZGExNWM4ZjZhYmM1MjJjNTY2ZGE0M2U1NGIyNjMwYzQ1MWRlZGE4MTFjMjFkMzE4MTg5ZmY4MDY3Yjc4NmRiEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGI2ZDQyOTMyMjhmODM4NDdhZjkyZjU3ODJiOWViNWUyNjc2OTgzMmQSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYjJhYTM1MTFhMzEzMjdkNDdkNTYyYzI5MmQ4YjQ0NWE5MDBiMmFiZhqAAT6ZUpabJf9F2lW8/3yP7ns2Tw8hi/SrggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwv5CNZRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApbKIAM=", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1t42ka8pz2acrr53vvvlxvmf422yxr2lcencxpn\"},{\"key\":\"amount\",\"value\":\"1983usei\"},{\"key\":\"receiver\",\"value\":\"sei1t42ka8pz2acrr53vvvlxvmf422yxr2lcencxpn\"},{\"key\":\"amount\",\"value\":\"4952usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp83gpd80\"},{\"key\":\"amount\",\"value\":\"1570usei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"1983usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1t42ka8pz2acrr53vvvlxvmf422yxr2lcencxpn\"},{\"key\":\"amount\",\"value\":\"489060000000\"},{\"key\":\"receiver\",\"value\":\"sei1t42ka8pz2acrr53vvvlxvmf422yxr2lcencxpn\"},{\"key\":\"amount\",\"value\":\"360600000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp83gpd80\"},{\"key\":\"amount\",\"value\":\"971200000000\"}]},{\"type\":\"wei_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"489060000000\"}]}]}]", + "gas_wanted": 577286, + "gas_used": 139024, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhiNkVlNDg4YjNEQ2FCOUEwMzIxMDI3Q2NmNjYzNzk5MjlkYjNCNURj", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjUyM3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzMxODAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDk1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXQ0MmthOHB6MmFjcnI1M3Z2dmx4dm1mNDIyeXhyMmxjZW5jeHBu", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzYwNjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xb6Ee488b3DCaB9A0321027Ccf66379929db3B5Dc", + "nonce": 302728, + "txHash": "0x964848c3686665ad08d9deedc2ef10976557f28b25fe3387d4a7281fd7b4a9dc" + } + }, + { + "data": "Cv8ICisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEs8ICJC+CCJCMHhmMTViNmVlMmM3YzRmYzIyMDU2NGQ5ZWNkNjczYzZlNDQwODhkYWM0YTIxZjU2ZWRiODc2ZTBhOGI4NWJiZGFmKnAKKjB4NUZGMTM3RDRiMEZEQ0Q0OURjQTMwYzdDRjU3RTU3OGEwMjZkMjc4ORJCMHhiYjQ3ZWUzZTE4M2E1NThiMWEyZmYwODc0YjA3OWYzZmM1NDc4Yjc0NTRlYWNmMmJmYzVhZjJmZjU4NzhmOTcyKrYBCioweEI5QTQwQjAyODkyMTA1NTJGMTk1RjBiNmZiOGZhNmNGMmQzMDcyMzcSQjB4MjBiYTUwOGRiOTVhYjE0OTc0MDhiMGRjNWJmNGJlNWNmMDQ5YWY2ZWFlYmViYjliYzQyOTQ3N2JmZjVjNTc5NBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN2QyNjk4NDFhNDkwODIwMDVlMmNhZTYyZTRjOTM3NDQwYmY1MjJmIAEqlQIKKjB4YjJhQTM1MTFBMzEzMjdkNDdENTYyYzI5MkQ4QjQ0NUE5MDBCMkFCZhJCMHgyMzI5OWFjYTJjODU3YTM0OWU0N2NjN2M2MjU0MzIwN2UyM2ZjMjFiZWE5YmU2OTQ4OGNlMmViOTAwOTVhY2RjGqABbLTTwk3GmMBv0ygbrwXQFULHE0CRZpuC+ujvgrbokbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dGVhbV9jbWZjMHBmdWswZThrY2owa2l0NTJtZWkyLXByal9jbWZjMHl2ZWwwZTloY2owa2pmOXY3aHhnAAAAACACKsEDCioweDVGRjEzN0Q0YjBGRENENDlEY0EzMGM3Q0Y1N0U1NzhhMDI2ZDI3ODkSQjB4NDk2MjhmZDE0NzEwMDZjMTQ4MmRhODgwMjhlOWNlNGRiYjA4MGI4MTVjOWIwMzQ0ZDM5ZTVhOGU2ZWMxNDE5ZhJCMHg2Y2I0ZDNjMjRkYzY5OGMwNmZkMzI4MWJhZjA1ZDAxNTQyYzcxMzQwOTE2NjliODJmYWU4ZWY4MmI2ZTg5MWI3EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3ZDI2OTg0MWE0OTA4MjAwNWUyY2FlNjJlNGM5Mzc0NDBiZjUyMmYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYjJhYTM1MTFhMzEzMjdkNDdkNTYyYzI5MmQ4YjQ0NWE5MDBiMmFiZhqAAeumf4NsFSFEs8Z6aOO+BnhdN0QaGOEbTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwv5CNZRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApbKIAM=", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1a40kk5yh7z0msmg4glupd7yv8rsy5gqnnpxm38\"},{\"key\":\"amount\",\"value\":\"1983usei\"},{\"key\":\"receiver\",\"value\":\"sei1a40kk5yh7z0msmg4glupd7yv8rsy5gqnnpxm38\"},{\"key\":\"amount\",\"value\":\"4952usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpgw9j3ch\"},{\"key\":\"amount\",\"value\":\"1570usei\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"1983usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1a40kk5yh7z0msmg4glupd7yv8rsy5gqnnpxm38\"},{\"key\":\"amount\",\"value\":\"489060000000\"},{\"key\":\"receiver\",\"value\":\"sei1a40kk5yh7z0msmg4glupd7yv8rsy5gqnnpxm38\"},{\"key\":\"amount\",\"value\":\"360600000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpgw9j3ch\"},{\"key\":\"amount\",\"value\":\"971200000000\"}]},{\"type\":\"wei_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei1tlcn049slhx5nh9rp3702ljh3gpx6fufqqnqlf\"},{\"key\":\"amount\",\"value\":\"489060000000\"}]}]}]", + "gas_wanted": 577286, + "gas_used": 139024, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgyYTI5NzAxOEMxMDc1RTdjYWY4MEUyM0ZDMTdjQzg0QmZkZTk4M2My", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjUyM3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzMxODAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXRsY24wNDlzbGh4NW5oOXJwMzcwMmxqaDNncHg2ZnVmcXFucWxm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTk4M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg5MDYwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDk1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWE0MGtrNXloN3owbXNtZzRnbHVwZDd5djhyc3k1Z3FubnB4bTM4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzYwNjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x2a297018C1075E7caf80E23FC17cC84Bfde983c2", + "nonce": 119972, + "txHash": "0xf15b6ee2c7c4fc220564d9ecd673c6e44088dac4a21f56edb876e0a8b85bbdaf" + } + }, + { + "data": "CswHCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEpwHCOzrBSJCMHg4ZGJmYzg3M2U1NjRmYjE3N2E0NThkY2MwYTZiOGU1NjRmNjhhYjA1MDUxNTE3OGVlNTJkOTcxYTZjMzAwZTYyKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqlQIKKjB4MDA1YjY0MzcyOEY1MTMwOTFhRDZiY2Y3N0UxM0Q3YjY2NDQyOUI4NxJCMHhjZWUzN2NhNDcxMmQ2MDViYzhlM2MwNTQxZWY4NjRiMTM1MTBiZmE3YTNmNjA0ZmM5ZjNmMTZhN2FlMzUxMDI1GqABn/f51fe9L5fVwBkJozv+iz2aNZdJwqWEscy+K+lxbhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADqggAAAAAAAAAAAAAAABFuZEKWe4ZVBAjZNzyCWobzB8iiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMLUAAAAAAAAAAAAAAABuZ7i9U6mch8YyoEuUwmCSGQDR1CAC", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17nms22vxx2q4wea9j02583dm0ah38n8fj9lgwg\"},{\"key\":\"amount\",\"value\":\"10usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpfnnxy99\"},{\"key\":\"amount\",\"value\":\"1052usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17nms22vxx2q4wea9j02583dm0ah38n8fj9lgwg\"},{\"key\":\"amount\",\"value\":\"593000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpfnnxy99\"},{\"key\":\"amount\",\"value\":\"964000000000\"}]}]}]", + "gas_wanted": 96687, + "gas_used": 95724, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg2ZTY3YjhiRDUzYTk5Qzg3YzYzMkEwNGI5NEMyNjA5MjE5MDBEMUQ0", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTdubXMyMnZ4eDJxNHdlYTlqMDI1ODNkbTBhaDM4bjhmajlsZ3dn", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdubXMyMnZ4eDJxNHdlYTlqMDI1ODNkbTBhaDM4bjhmajlsZ3dn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA2M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdubXMyMnZ4eDJxNHdlYTlqMDI1ODNkbTBhaDM4bjhmajlsZ3dn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTU3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdubXMyMnZ4eDJxNHdlYTlqMDI1ODNkbTBhaDM4bjhmajlsZ3dn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTB1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdubXMyMnZ4eDJxNHdlYTlqMDI1ODNkbTBhaDM4bjhmajlsZ3dn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x6e67b8bD53a99C87c632A04b94C260921900D1D4", + "nonce": 59, + "txHash": "0x8dbfc873e564fb177a458dcc0a6b8e564f68ab050515178ee52d971a6c300e62" + } + }, + { + "data": "CswHCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEpwHCITsBSJCMHg4YWRhOTU1OTgzYTg5MzQxMDcwNWYyYjEwODhlNDQyYzAzMTEwZGIyMTlkZGVkYzdlNzZjZDMxNTliZTdiYjA3KpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNGNhZjYzODU4NThmNDE4YmQwNmI2OTVlNzU3MTBiMTE3YTk0MTc3EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNGNhZjYzODU4NThmNDE4YmQwNmI2OTVlNzU3MTBiMTE3YTk0MTc3EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqlQIKKjB4MDA1YjY0MzcyOEY1MTMwOTFhRDZiY2Y3N0UxM0Q3YjY2NDQyOUI4NxJCMHhjZWUzN2NhNDcxMmQ2MDViYzhlM2MwNTQxZWY4NjRiMTM1MTBiZmE3YTNmNjA0ZmM5ZjNmMTZhN2FlMzUxMDI1GqABhN52LrLLGFE9y80bX90DoqimsFAqBIfAJoEKI1JS1YUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdbQAAAAAAAAAAAAAAAATK9jhYWPQYvQa2ledXELEXqUF3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0oAAAAAAAAAAAAAAAARbmRClnuGVQQI2Tc8glqG8wfIoiAC", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1lz7fxazku23c0yx0mxz76mkvt4h07ct8q6p2gd\"},{\"key\":\"amount\",\"value\":\"10usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp2aqnjt6\"},{\"key\":\"amount\",\"value\":\"1053usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1lz7fxazku23c0yx0mxz76mkvt4h07ct8q6p2gd\"},{\"key\":\"amount\",\"value\":\"593000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp2aqnjt6\"},{\"key\":\"amount\",\"value\":\"228000000000\"}]}]}]", + "gas_wanted": 96711, + "gas_used": 95748, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgwNENBZjYzODU4NThmNDE4QkQwNmI2OTVlNzU3MTBiMTE3QTk0MTc3", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWx6N2Z4YXprdTIzYzB5eDBteHo3Nm1rdnQ0aDA3Y3Q4cTZwMmdk", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWx6N2Z4YXprdTIzYzB5eDBteHo3Nm1rdnQ0aDA3Y3Q4cTZwMmdk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA2M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWx6N2Z4YXprdTIzYzB5eDBteHo3Nm1rdnQ0aDA3Y3Q4cTZwMmdk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODIxMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWx6N2Z4YXprdTIzYzB5eDBteHo3Nm1rdnQ0aDA3Y3Q4cTZwMmdk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTB1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWx6N2Z4YXprdTIzYzB5eDBteHo3Nm1rdnQ0aDA3Y3Q4cTZwMmdk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjI4MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x04CAf6385858f418BD06b695e75710b117A94177", + "nonce": 74, + "txHash": "0x8ada955983a893410705f2b1088e442c03110db219ddedc7e76cd3159be7bb07" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCO/qBiJCMHgzYzYxYTFlMTc0YjJkNzFmMGQ2YWQ4MTkxYjI3MjU3ZjVjNDMwZDU3YzRjZGRkYzBlMzVlZmQ4YjVhMTMwYTg1KpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVmYmFkYTljYWI3MjM0NThiZGQ2NDgyZjU3ZmVkZWE4NDdmZDdlZTUSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWZiYWRhOWNhYjcyMzQ1OGJkZDY0ODJmNTdmZWRlYTg0N2ZkN2VlNRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAY+ejZct4YcraaOqH1Iu+zZAoJtpEPjPjCxZa2IpWX9GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA64oAAAAAAAAAAAAAAAARbmRClnuGVQQI2Tc8glqG8wfIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgLAAAAAAAAAAAAAAAAX7ranKtyNFi91kgvV/7eqEf9fuUgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1em05qz9a4dwvvh5l0wlwq7tn899y7jqtq3ljtq\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqptqk88kg\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1em05qz9a4dwvvh5l0wlwq7tn899y7jqtq3ljtq\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqptqk88kg\"},{\"key\":\"amount\",\"value\":\"813000000000\"}]}]}]", + "gas_wanted": 113010, + "gas_used": 111983, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg1ZkJBRGE5Q2FiNzIzNDU4YkRENjQ4MkY1N2ZFREVBODQ3RmQ3ZWU1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWVtMDVxejlhNGR3dnZoNWwwd2x3cTd0bjg5OXk3anF0cTNsanRx", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWVtMDVxejlhNGR3dnZoNWwwd2x3cTd0bjg5OXk3anF0cTNsanRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWVtMDVxejlhNGR3dnZoNWwwd2x3cTd0bjg5OXk3anF0cTNsanRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWVtMDVxejlhNGR3dnZoNWwwd2x3cTd0bjg5OXk3anF0cTNsanRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWVtMDVxejlhNGR3dnZoNWwwd2x3cTd0bjg5OXk3anF0cTNsanRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x5fBADa9Cab723458bDD6482F57fEDEA847Fd7ee5", + "nonce": 37, + "txHash": "0x3c61a1e174b2d71f0d6ad8191b27257f5c430d57c4cdddc0e35efd8b5a130a85" + } + }, + { + "data": "CswHCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEpwHCOzrBSJCMHhlYTU5NTM3M2RlNzgxODZiMmMxYTFkMjg1ZjQ2YTBkZjc4OTA0NDgxOGI1ODgzYmFiNjE0MTYyNmQ3NzkxYWUyKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqlQIKKjB4MDA1YjY0MzcyOEY1MTMwOTFhRDZiY2Y3N0UxM0Q3YjY2NDQyOUI4NxJCMHhjZWUzN2NhNDcxMmQ2MDViYzhlM2MwNTQxZWY4NjRiMTM1MTBiZmE3YTNmNjA0ZmM5ZjNmMTZhN2FlMzUxMDI1GqABX/Jz7AltuyyMTSXf0wmodLMqkInXWqNBcmXKvWm0DYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvdAAAAAAAAAAAAAAAABFuZEKWe4ZVBAjZNzyCWobzB8iiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0YAAAAAAAAAAAAAAACePzOflQdEtYNXIp1t/NJI9GK3HCAC", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1g6lfyhcdpu2taq50a57pr2ns5z5mqpz7naexsd\"},{\"key\":\"amount\",\"value\":\"10usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpvp0shhd\"},{\"key\":\"amount\",\"value\":\"1052usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1g6lfyhcdpu2taq50a57pr2ns5z5mqpz7naexsd\"},{\"key\":\"amount\",\"value\":\"593000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpvp0shhd\"},{\"key\":\"amount\",\"value\":\"964000000000\"}]}]}]", + "gas_wanted": 96687, + "gas_used": 95724, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg5ZTNmMzM5Zjk1MDc0NGI1ODM1NzIyOUQ2RGZDZDI0OEY0NjJiNzFj", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWc2bGZ5aGNkcHUydGFxNTBhNTdwcjJuczV6NW1xcHo3bmFleHNk", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWc2bGZ5aGNkcHUydGFxNTBhNTdwcjJuczV6NW1xcHo3bmFleHNk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA2M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWc2bGZ5aGNkcHUydGFxNTBhNTdwcjJuczV6NW1xcHo3bmFleHNk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTU3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWc2bGZ5aGNkcHUydGFxNTBhNTdwcjJuczV6NW1xcHo3bmFleHNk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTB1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWc2bGZ5aGNkcHUydGFxNTBhNTdwcjJuczV6NW1xcHo3bmFleHNk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x9e3f339f950744b58357229D6DfCd248F462b71c", + "nonce": 29, + "txHash": "0xea595373de78186b2c1a1d285f46a0df789044818b5883bab6141626d7791ae2" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCO/qBiJCMHgwNmM3YWMyZTE4MjY1ZDNiZTVkNGQxNjk0OTljMTJkMTA3ZGJmNmUyZTZkMTE0NDNmOWUyZTA0OGM0Mjc5YjFjKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3M2M1M2IwODY1OTkwOGU5YTA2MWFiNTJjNzMyYjI1NjU3YTYyOTRjEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3M2M1M2IwODY1OTkwOGU5YTA2MWFiNTJjNzMyYjI1NjU3YTYyOTRjEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExNmU2NDQyOTY3Yjg2NTUwNDA4ZDkzNzNjODI1YTg2ZjMwN2M4YTISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE2ZTY0NDI5NjdiODY1NTA0MDhkOTM3M2M4MjVhODZmMzA3YzhhMhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAYHSI0p6lwxAXx0kq5GC8f9PQJ7UwkD8hNCV80ObJ16kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6ogAAAAAAAAAAAAAAABzxTsIZZkI6aBhq1LHMrJWV6YpTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKbUAAAAAAAAAAAAAAAAEW5kQpZ7hlUECNk3PIJahvMHyKIgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1j9s4nulu363tastnxprruv5qy33xhhtdxr7xwf\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpdueyz2l\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1j9s4nulu363tastnxprruv5qy33xhhtdxr7xwf\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpdueyz2l\"},{\"key\":\"amount\",\"value\":\"813000000000\"}]}]}]", + "gas_wanted": 113010, + "gas_used": 111983, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg3M2M1M2IwODY1OTkwOGU5YTA2MWFiNTJDNzMyYjI1NjU3YTYyOTRD", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWo5czRudWx1MzYzdGFzdG54cHJydXY1cXkzM3hoaHRkeHI3eHdm", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWo5czRudWx1MzYzdGFzdG54cHJydXY1cXkzM3hoaHRkeHI3eHdm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWo5czRudWx1MzYzdGFzdG54cHJydXY1cXkzM3hoaHRkeHI3eHdm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWo5czRudWx1MzYzdGFzdG54cHJydXY1cXkzM3hoaHRkeHI3eHdm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWo5czRudWx1MzYzdGFzdG54cHJydXY1cXkzM3hoaHRkeHI3eHdm", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x73c53b08659908e9a061ab52C732b25657a6294C", + "nonce": 67, + "txHash": "0x06c7ac2e18265d3be5d4d169499c12d107dbf6e2e6d11443f9e2e048c4279b1c" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCO/qBiJCMHg5NjcxNGNmMDUzNGIyMzIwNDFhYjU5YmQ1OTUxOWI0NzJhZWZkODE0OTVkYzI4OWM1YWJlY2ZhNjYzZmFjM2U4KpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4NDg4OTY2NjRjNjlhOWY2NDg4NThiOTg4NTM1NmI1ZDAwNmZjYzUSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg0ODg5NjY2NGM2OWE5ZjY0ODg1OGI5ODg1MzU2YjVkMDA2ZmNjNRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAXDlJqb86SYb3wwy1Y6OvOgdnA6oU/FuFAQxkCBV+N7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6mgAAAAAAAAAAAAAAAARbmRClnuGVQQI2Tc8glqG8wfIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANS3AAAAAAAAAAAAAAAAiEiJZmTGmp9kiFi5iFNWtdAG/MUgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1u9zx9yqtvv440xn00aq3e92vlfxhsve34wfl87\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpwj235yq\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1u9zx9yqtvv440xn00aq3e92vlfxhsve34wfl87\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpwj235yq\"},{\"key\":\"amount\",\"value\":\"813000000000\"}]}]}]", + "gas_wanted": 113010, + "gas_used": 111983, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg4ODQ4ODk2NjY0YzY5YTlmNjQ4ODU4Yjk4ODUzNTZCNUQwMDZGQ2M1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMXU5eng5eXF0dnY0NDB4bjAwYXEzZTkydmxmeGhzdmUzNHdmbDg3", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXU5eng5eXF0dnY0NDB4bjAwYXEzZTkydmxmeGhzdmUzNHdmbDg3", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXU5eng5eXF0dnY0NDB4bjAwYXEzZTkydmxmeGhzdmUzNHdmbDg3", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXU5eng5eXF0dnY0NDB4bjAwYXEzZTkydmxmeGhzdmUzNHdmbDg3", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXU5eng5eXF0dnY0NDB4bjAwYXEzZTkydmxmeGhzdmUzNHdmbDg3", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x8848896664c69a9f648858b9885356B5D006FCc5", + "nonce": 94, + "txHash": "0x96714cf0534b232041ab59bd59519b472aefd81495dc289c5abecfa663fac3e8" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCO/qBiJCMHhmYTAwMTU3NWNmOTIxOGNlOTkxN2E0OTY5NGUxMGM4NGEwZTlhYTg5Nzk1MTQwN2JhMTQ0ZGFiMDQxODZlNDljKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNiNDViMzE5M2VlZTNmOTFhOWZiN2Q4MDU3NzA3YzEyN2UzOWIyZDISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2I0NWIzMTkzZWVlM2Y5MWE5ZmI3ZDgwNTc3MDdjMTI3ZTM5YjJkMhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAWo+JeXtwh4qSlP/FAuqiM8XPMpSomyiJ41x15ef3NpHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6xAAAAAAAAAAAAAAAAARbmRClnuGVQQI2Tc8glqG8wfIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKxlAAAAAAAAAAAAAAAAO0WzGT7uP5Gp+32AV3B8En45stIgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei18dmugca8zhnxspwsht2jgvzsryw6hd7en2396y\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp00u9pej\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei18dmugca8zhnxspwsht2jgvzsryw6hd7en2396y\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp00u9pej\"},{\"key\":\"amount\",\"value\":\"813000000000\"}]}]}]", + "gas_wanted": 113010, + "gas_used": 111983, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgzQjQ1YjMxOTNFRWUzZjkxYTlmYjdkODA1NzcwN0MxMjdFMzliMmQy", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMThkbXVnY2E4emhueHNwd3NodDJqZ3Z6c3J5dzZoZDdlbjIzOTZ5", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMThkbXVnY2E4emhueHNwd3NodDJqZ3Z6c3J5dzZoZDdlbjIzOTZ5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMThkbXVnY2E4emhueHNwd3NodDJqZ3Z6c3J5dzZoZDdlbjIzOTZ5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMThkbXVnY2E4emhueHNwd3NodDJqZ3Z6c3J5dzZoZDdlbjIzOTZ5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMThkbXVnY2E4emhueHNwd3NodDJqZ3Z6c3J5dzZoZDdlbjIzOTZ5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x3B45b3193EEe3f91a9fb7d8057707C127E39b2d2", + "nonce": 37, + "txHash": "0xfa001575cf9218ce9917a49694e10c84a0e9aa897951407ba144dab04186e49c" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCPvqBiJCMHgyYTkxOWI2MjJiZTM3OTg4NGIyOGE5OGFjYjVlYjVjNjdkMWJmYmE0M2RlMmQ1MWE2ZDMyNTEyMmVlMGJkOTJjKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjZGUwMDFlOTlmNmQ0ZjFlZjY2NjUzNGY4NTFmYTdlOTNiODk4YzRlEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjZGUwMDFlOTlmNmQ0ZjFlZjY2NjUzNGY4NTFmYTdlOTNiODk4YzRlEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExNmU2NDQyOTY3Yjg2NTUwNDA4ZDkzNzNjODI1YTg2ZjMwN2M4YTISQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE2ZTY0NDI5NjdiODY1NTA0MDhkOTM3M2M4MjVhODZmMzA3YzhhMhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAVHdZLrs442fRkFdilslGFkRwn+v0mB36nUweMR/X+YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBDwAAAAAAAAAAAAAAADN4AHpn21PHvZmU0+FH6fpO4mMTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSfAAAAAAAAAAAAAAAAEW5kQpZ7hlUECNk3PIJahvMHyKIgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1nuey6ehp6ut9a6fcs0w2kl0vr28n6336u8yft5\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqps9s79ne\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1nuey6ehp6ut9a6fcs0w2kl0vr28n6336u8yft5\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqps9s79ne\"},{\"key\":\"amount\",\"value\":\"945000000000\"}]}]}]", + "gas_wanted": 113022, + "gas_used": 111995, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhjREUwMDFFOTlGNmQ0RjFlRjY2NjUzNGY4NTFGYTdlOTNiODk4QzRF", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMW51ZXk2ZWhwNnV0OWE2ZmNzMHcya2wwdnIyOG42MzM2dTh5ZnQ1", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMW51ZXk2ZWhwNnV0OWE2ZmNzMHcya2wwdnIyOG42MzM2dTh5ZnQ1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMW51ZXk2ZWhwNnV0OWE2ZmNzMHcya2wwdnIyOG42MzM2dTh5ZnQ1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjQyMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMW51ZXk2ZWhwNnV0OWE2ZmNzMHcya2wwdnIyOG42MzM2dTh5ZnQ1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMW51ZXk2ZWhwNnV0OWE2ZmNzMHcya2wwdnIyOG42MzM2dTh5ZnQ1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTQ1MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xcDE001E99F6d4F1eF666534f851Fa7e93b898C4E", + "nonce": 82, + "txHash": "0x2a919b622be379884b28a98acb5eb5c67d1bfba43de2d51a6d325122ee0bd92c" + } + }, + { + "data": "CtMZCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEqMZCPjIDRqAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuzvcQrD/zlJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpk0SMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWmif6ua2rIkIweDZjMWNkNzk4MmM4YmY2NTJlY2QxYzNlZWU0NDgwYmJkMjU3MjczZGM1ZGI2ZWRjNjQ2YTdhNWVmMDc5ZDExNTAq2gIKKjB4RDk4MzRkN2NhQTJBQ2Y4MUM0MGU3QUFDNjQ1Q2Y5YTU3Y2IxNGJjZBJCMHg3MzBlOGUyY2MyODdjZDUyOTY0NDVjY2VmMGRjZjdmMDY5NWQ4YjNkNjIwZGNjOWRkMTljNjcxYTZmNTY2M2E1EkIweGQ3NjhlZGQ3MDdiMzIxZTJjNDMzNzdlM2Y0MzdlNjFkZjM0MmY0MGI3MzE0MWI3NTAzYmIzNjdmOTYzYjM3YTMSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTliYzc3OTQ5YWMzZDc1YTNjYTgzYjVjMmZjMjQ5YjgyOGI5ZmM2Mxpg///////////////////////////////////////7eF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAALtFctzY+ogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKpwCCioweGUxNWZDMzhGNkQ4YzU2YUYwN2JiQ0JlM0JBZjU3MDhBMkJmNDIzOTISQjB4ZGRmMjUyYWQxYmUyYzg5YjY5YzJiMDY4ZmMzNzhkYWE5NTJiYTdmMTYzYzRhMTE2MjhmNTVhNGRmNTIzYjNlZhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxOWJjNzc5NDlhYzNkNzVhM2NhODNiNWMyZmMyNDliODI4YjlmYzYzEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGQ5ODM0ZDdjYWEyYWNmODFjNDBlN2FhYzY0NWNmOWE1N2NiMTRiY2QaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaZNEjIAEqnAIKKjB4ZTE1ZkMzOEY2RDhjNTZhRjA3YmJDQmUzQkFmNTcwOEEyQmY0MjM5MhJCMHhkZGYyNTJhZDFiZTJjODliNjljMmIwNjhmYzM3OGRhYTk1MmJhN2YxNjNjNGExMTYyOGY1NWE0ZGY1MjNiM2VmEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGQ5ODM0ZDdjYWEyYWNmODFjNDBlN2FhYzY0NWNmOWE1N2NiMTRiY2QSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpk0SMgAiqcAgoqMHhlMTVmQzM4RjZEOGM1NmFGMDdiYkNCZTNCQWY1NzA4QTJCZjQyMzkyEkIweDhjNWJlMWU1ZWJlYzdkNWJkMTRmNzE0MjdkMWU4NGYzZGQwMzE0YzBmN2IyMjkxZTViMjAwYWM4YzdjM2I5MjUSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1NTE0YTQxNmExNDMyNGE3YTA5MTg4OTlhMTdjZWI4NTQ4NWFlOTI0GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmTRIyADKpwCCioweGUxNWZDMzhGNkQ4YzU2YUYwN2JiQ0JlM0JBZjU3MDhBMkJmNDIzOTISQjB4ZGRmMjUyYWQxYmUyYzg5YjY5YzJiMDY4ZmMzNzhkYWE5NTJiYTdmMTYzYzRhMTE2MjhmNTVhNGRmNTIzYjNlZhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YmEwNzYxZmY2NDQ1NjA1MjliMGY1NDM2MmM4ZjYwMjQxNzU5MjhiEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGFhN2JmNDNjNmEyNmJkN2YxNzcxODQ0NGUxZjg4ZmJiNGE3OGFmYWEaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaZNEjIAQqnAIKKjB4RTMwZmVEZDE1OEEyZTNiMTNlOWJhZGFlQUJhRmM1NTE2ZTk1ZThDNxJCMHhkZGYyNTJhZDFiZTJjODliNjljMmIwNjhmYzM3OGRhYTk1MmJhN2YxNjNjNGExMTYyOGY1NWE0ZGY1MjNiM2VmEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGFhN2JmNDNjNmEyNmJkN2YxNzcxODQ0NGUxZjg4ZmJiNGE3OGFmYWESQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7RXLc2PqIAAAgBSqcAgoqMHhFMzBmZURkMTU4QTJlM2IxM2U5YmFkYWVBQmFGYzU1MTZlOTVlOEM3EkIweGRkZjI1MmFkMWJlMmM4OWI2OWMyYjA2OGZjMzc4ZGFhOTUyYmE3ZjE2M2M0YTExNjI4ZjU1YTRkZjUyM2IzZWYSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWJhMDc2MWZmNjQ0NTYwNTI5YjBmNTQzNjJjOGY2MDI0MTc1OTI4YhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBkOTgzNGQ3Y2FhMmFjZjgxYzQwZTdhYWM2NDVjZjlhNTdjYjE0YmNkGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALtFctzY+ogAACAGKpwCCioweEUzMGZlRGQxNThBMmUzYjEzZTliYWRhZUFCYUZjNTUxNmU5NWU4QzcSQjB4ZGRmMjUyYWQxYmUyYzg5YjY5YzJiMDY4ZmMzNzhkYWE5NTJiYTdmMTYzYzRhMTE2MjhmNTVhNGRmNTIzYjNlZhJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBkOTgzNGQ3Y2FhMmFjZjgxYzQwZTdhYWM2NDVjZjlhNTdjYjE0YmNkEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE5YmM3Nzk0OWFjM2Q3NWEzY2E4M2I1YzJmYzI0OWI4MjhiOWZjNjMaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuzvcQrD/zlJVIAcqgAMKKjB4RDk4MzRkN2NhQTJBQ2Y4MUM0MGU3QUFDNjQ1Q2Y5YTU3Y2IxNGJjZBJCMHg1NTc1ZDdkN2MwMWFkYjRlZWVlMWUyZWM0YTYzNjUyZmRmNTA4NmQ3MWZkMzI1ZmExYWY4MDM0Nzk2Yjg5OTA0EkIweGQ3NjhlZGQ3MDdiMzIxZTJjNDMzNzdlM2Y0MzdlNjFkZjM0MmY0MGI3MzE0MWI3NTAzYmIzNjdmOTYzYjM3YTMSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTliYzc3OTQ5YWMzZDc1YTNjYTgzYjVjMmZjMjQ5YjgyOGI5ZmM2MxJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJmMmY4GkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALtFctzY+ogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaZNEjIAgqnAIKKjB4RDk4MzRkN2NhQTJBQ2Y4MUM0MGU3QUFDNjQ1Q2Y5YTU3Y2IxNGJjZBJCMHhlYWI5ZjkyMGVkYTM4ZTJlMTBjZmM3NmIzZjg1MjAxYjhiYmU4MmZhYzY5ZGU0YzQ1MDkwMDFiNjZlNWUzM2FmEkIweGQ3NjhlZGQ3MDdiMzIxZTJjNDMzNzdlM2Y0MzdlNjFkZjM0MmY0MGI3MzE0MWI3NTAzYmIzNjdmOTYzYjM3YTMSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTliYzc3OTQ5YWMzZDc1YTNjYTgzYjVjMmZjMjQ5YjgyOGI5ZmM2MxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZaaJ/q5rasgCQ==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei10uguvajtjytg5wkrtqp6ngwmn9wx2qddnr5yxt\"},{\"key\":\"amount\",\"value\":\"10470usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp3cx2swt\"},{\"key\":\"amount\",\"value\":\"2445usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei10uguvajtjytg5wkrtqp6ngwmn9wx2qddnr5yxt\"},{\"key\":\"amount\",\"value\":\"658000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqp3cx2swt\"},{\"key\":\"amount\",\"value\":\"608000000000\"}]}]}]", + "gas_wanted": 1174206, + "gas_used": 222328, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHgxOWJDNzc5NDlhQzNkNzVhM2NhODNCNWMyZmMyNDliODI4QjlGYzYz", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTB1Z3V2YWp0anl0ZzV3a3J0cXA2bmd3bW45d3gycWRkbnI1eXh0", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTB1Z3V2YWp0anl0ZzV3a3J0cXA2bmd3bW45d3gycWRkbnI1eXh0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI5MTZ1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTB1Z3V2YWp0anl0ZzV3a3J0cXA2bmd3bW45d3gycWRkbnI1eXh0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjY2MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTB1Z3V2YWp0anl0ZzV3a3J0cXA2bmd3bW45d3gycWRkbnI1eXh0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA0NzB1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTB1Z3V2YWp0anl0ZzV3a3J0cXA2bmd3bW45d3gycWRkbnI1eXh0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjU4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjQ0NXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjA4MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x19bC77949aC3d75a3ca83B5c2fc249b828B9Fc63", + "nonce": 230752, + "txHash": "0x6c1cd7982c8bf652ecd1c3eee4480bbd257273dc5db6edc646a7a5ef079d1150" + } + }, + { + "data": "CooMCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEtoLCO/qBiJCMHhhY2JkODgyMzQ0ZmM3M2EzNzI4ODZmMTEzYmJlNzllNWUwZjlmYzc2NDcyOGRmYzVkYWY0MzM5NTMyMTljN2U2KpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqnAIKKjB4RjFjZkVDYThjNTY3NDBFNjQ2Mjc5RDdBZTEwNjdFYjRCMzY1NzFBMBJCMHhlZjAwMWY0NTBjYTEyODg5ZWJjZDhiYmFjNmRhZGY5M2ExZmMwMTZhMmUyMTU3YzJmNWVjZjJhNjE3ZmIzMTI4EkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZhMjQ5ZTRhNzBjYTVlYjhkNzUyZDZlOTA4YjJhZjY2ODNkODdlMjUSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1YjY0MzcyOGY1MTMwOTFhZDZiY2Y3N2UxM2Q3YjY2NDQyOWI4NxogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAiqcAgoqMHhGMWNmRUNhOGM1Njc0MEU2NDYyNzlEN0FlMTA2N0ViNEIzNjU3MUEwEkIweDdkMTU1ODY5MzQ1NzU1OWVlMWIwZDc2NDhhY2JhMzc2OTk2YjUxNjFlMDEyNWU2OTk4ZDg5OTI4OGIzMTJjYjgSQjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmEyNDllNGE3MGNhNWViOGQ3NTJkNmU5MDhiMmFmNjY4M2Q4N2UyNRJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDViNjQzNzI4ZjUxMzA5MWFkNmJjZjc3ZTEzZDdiNjY0NDI5Yjg3GiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUCADKpUCCioweDAwNWI2NDM3MjhGNTEzMDkxYUQ2YmNmNzdFMTNEN2I2NjQ0MjlCODcSQjB4Y2VlMzdjYTQ3MTJkNjA1YmM4ZTNjMDU0MWVmODY0YjEzNTEwYmZhN2EzZjYwNGZjOWYzZjE2YTdhZTM1MTAyNRqgAYLgz/BFhMm0QWl8Om/2QYHZfhY1UvcGXBAxWxzBjsJaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AwAAAAAAAAAAAAAAAARbmRClnuGVQQI2Tc8glqG8wfIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJRVAAAAAAAAAAAAAAAAaiSeSnDKXrjXUtbpCLKvZoPYfiUgBA==", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17myl4vzyaq3z3napv5rz7hq44jw0335c6yfqtk\"},{\"key\":\"amount\",\"value\":\"11usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpjk4lxq5\"},{\"key\":\"amount\",\"value\":\"1231usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei17myl4vzyaq3z3napv5rz7hq44jw0335c6yfqtk\"},{\"key\":\"amount\",\"value\":\"297000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpjk4lxq5\"},{\"key\":\"amount\",\"value\":\"813000000000\"}]}]}]", + "gas_wanted": 113010, + "gas_used": 111983, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHg2QTI0OUU0YTcwY0E1ZUI4RDc1MmQ2ZTkwOGIyQUY2NjgzRDg3RTI1", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMTdteWw0dnp5YXEzejNuYXB2NXJ6N2hxNDRqdzAzMzVjNnlmcXRr", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdteWw0dnp5YXEzejNuYXB2NXJ6N2hxNDRqdzAzMzVjNnlmcXRr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTI0M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdteWw0dnp5YXEzejNuYXB2NXJ6N2hxNDRqdzAzMzVjNnlmcXRr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTEwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdteWw0dnp5YXEzejNuYXB2NXJ6N2hxNDRqdzAzMzVjNnlmcXRr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTF1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTdteWw0dnp5YXEzejNuYXB2NXJ6N2hxNDRqdzAzMzVjNnlmcXRr", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mjk3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0x6A249E4a70cA5eB8D752d6e908b2AF6683D87E25", + "nonce": 98, + "txHash": "0xacbd882344fc73a372886f113bbe79e5e0f9fc764728dfc5daf433953219c7e6" + } + }, + { + "data": "CswHCisvc2VpcHJvdG9jb2wuc2VpY2hhaW4uZXZtLk1zZ0VWTVRyYW5zYWN0aW9uEpwHCOzrBSJCMHhlMzZjZWY2MTZlMjRmY2Q0ZTFhOWUyMWVkOTEzZGE3NDhjYzMxMmNmY2Q5NGU5YTU0MzRkMTk2ZjEwYzAzOThjKpoCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4ZWYwMDFmNDUwY2ExMjg4OWViY2Q4YmJhYzZkYWRmOTNhMWZjMDE2YTJlMjE1N2MyZjVlY2YyYTYxN2ZiMzEyOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKpwCCioweEYxY2ZFQ2E4YzU2NzQwRTY0NjI3OUQ3QWUxMDY3RWI0QjM2NTcxQTASQjB4N2QxNTU4NjkzNDU3NTU5ZWUxYjBkNzY0OGFjYmEzNzY5OTZiNTE2MWUwMTI1ZTY5OThkODk5Mjg4YjMxMmNiOBJCMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTZlNjQ0Mjk2N2I4NjU1MDQwOGQ5MzczYzgyNWE4NmYzMDdjOGEyEkIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWI2NDM3MjhmNTEzMDkxYWQ2YmNmNzdlMTNkN2I2NjQ0MjliODcaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIAEqlQIKKjB4MDA1YjY0MzcyOEY1MTMwOTFhRDZiY2Y3N0UxM0Q3YjY2NDQyOUI4NxJCMHhjZWUzN2NhNDcxMmQ2MDViYzhlM2MwNTQxZWY4NjRiMTM1MTBiZmE3YTNmNjA0ZmM5ZjNmMTZhN2FlMzUxMDI1GqAB5R6WZiZcx40N7l/4O5GPf4EQCVglmxHNsqyy0IsoEUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADqowAAAAAAAAAAAAAAABFuZEKWe4ZVBAjZNzyCWobzB8iiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzgAAAAAAAAAAAAAAADd82Qpq9UixER6j4MiccCOrzwI3iAC", + "log": "[{\"events\":[{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1edgd3q4498fwk4zmukdpvgr47p9f2qekyvwy9v\"},{\"key\":\"amount\",\"value\":\"10usei\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpntrtnax\"},{\"key\":\"amount\",\"value\":\"1052usei\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/seiprotocol.seichain.evm.MsgEVMTransaction\"}]},{\"type\":\"wei_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei1edgd3q4498fwk4zmukdpvgr47p9f2qekyvwy9v\"},{\"key\":\"amount\",\"value\":\"593000000000\"},{\"key\":\"receiver\",\"value\":\"sei1v4mx6hmrda5kucnpwdjsqqqqqqqqqqpntrtnax\"},{\"key\":\"amount\",\"value\":\"964000000000\"}]}]}]", + "gas_wanted": 96687, + "gas_used": 95724, + "events": [ + { + "type": "signer", + "attributes": [ + { + "key": "ZXZtX2FkZHI=", + "value": "MHhkZEYzNjQyOUFCZDUyMmM0NDQ3QThGODMyMjcxQzA4RWFmM2MwOERF", + "index": true + }, + { + "key": "c2VpX2FkZHI=", + "value": "c2VpMWVkZ2QzcTQ0OThmd2s0em11a2RwdmdyNDdwOWYycWVreXZ3eTl2", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWVkZ2QzcTQ0OThmd2s0em11a2RwdmdyNDdwOWYycWVreXZ3eTl2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA2M3VzZWk=", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMWVkZ2QzcTQ0OThmd2s0em11a2RwdmdyNDdwOWYycWVreXZ3eTl2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTU3MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L3NlaXByb3RvY29sLnNlaWNoYWluLmV2bS5Nc2dFVk1UcmFuc2FjdGlvbg==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWVkZ2QzcTQ0OThmd2s0em11a2RwdmdyNDdwOWYycWVreXZ3eTl2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTB1c2Vp", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWVkZ2QzcTQ0OThmd2s0em11a2RwdmdyNDdwOWYycWVreXZ3eTl2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + } + ], + "evm_tx_info": { + "senderAddress": "0xddF36429ABd522c4447A8F832271C08Eaf3c08DE", + "nonce": 97, + "txHash": "0xe36cef616e24fcd4e1a9e21ed913da748cc312cfcd94e9a5434d196f10c0398c" + } + } + ], + "total_gas_used": "7731615", + "finalize_block_events": [ + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mzc4MDh1c2Vp", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMWp2NjVzM2dycWY2djZqbDNkcDR0NmM5dDlyazk5Y2Q4Mm40MjA3", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mzc4MDh1c2Vp", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMWp2NjVzM2dycWY2djZqbDNkcDR0NmM5dDlyazk5Y2Q4Mm40MjA3", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Mzc4MDh1c2Vp", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + } + ] + }, + { + "type": "proposer_reward", + "attributes": [ + { + "key": "YW1vdW50", + "value": null, + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": null, + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": null, + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTIwLjQ2Mzc3MTU2ODE3NjMyNzg0MnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE4dHBkZXQyMmtwdnN3eGF5ZWt3bjU1cnkwcjVhY3g0a2FhdXVwaw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjQwOS4yNzU0MzEzNjM1MjY1NTY4NDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE4dHBkZXQyMmtwdnN3eGF5ZWt3bjU1cnkwcjVhY3g0a2FhdXVwaw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "OTcuMjkwOTc5ODE4NjYwMTM4OTcydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF1bW1ueTRwNjQ1eHJheGM0bTducGhmN3Z4YXdmenQzcDVobjQ3dA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTk0NS44MTk1OTYzNzMyMDI3Nzk0NDB1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF1bW1ueTRwNjQ1eHJheGM0bTducGhmN3Z4YXdmenQzcDVobjQ3dA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "ODQuNTI5OTMxOTExMzE2Mjk1NDgydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0Nm0wODlscThta3F3NncwbW1saHh6NjI0N2cydGFoYTg5YXQ3NA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTY5MC41OTg2MzgyMjYzMjU5MDk2NDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0Nm0wODlscThta3F3NncwbW1saHh6NjI0N2cydGFoYTg5YXQ3NA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "ODIuMTE5OTgwNjYxNTA4ODQ3NDY2dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF3d2ZwbWN2ZWhxNnlxZHhmY2NzNXJkcjc0NXEza215MDZsOWQwZA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTY0Mi4zOTk2MTMyMzAxNzY5NDkzMTJ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF3d2ZwbWN2ZWhxNnlxZHhmY2NzNXJkcjc0NXEza215MDZsOWQwZA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "ODAuNDczNjAwMDA4NTQyNDE5ODEzdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE2cGo1Z2xqcW5xczBhanhha2NjZmpodTA1eWN6cDk4NzQzY3RneQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTYwOS40NzIwMDAxNzA4NDgzOTYyNTZ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE2cGo1Z2xqcW5xczBhanhha2NjZmpodTA1eWN6cDk4NzQzY3RneQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NzYuOTQzNTAxODkwNjY0NzU3MTA1dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4bTBwanQzcXNkbGM2dTRuN2ZqcHljcWQ1aDd6d2xhN3R6OG0zNw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTUzOC44NzAwMzc4MTMyOTUxNDIwOTZ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4bTBwanQzcXNkbGM2dTRuN2ZqcHljcWQ1aDd6d2xhN3R6OG0zNw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NzMuNTIxODg2MjYzMzUxNDA0NzQydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTQ3MC40Mzc3MjUyNjcwMjgwOTQ4NDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE1eGdmazljbnQ1NnhqdnF2ZXRqdmczd2xxbHNsZm5xZmMwM2R3aw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NzMuMjg2MzkyMjU1ODc4MjM2NjYydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4aHhuYWQzYzg2cTNkOGdnc3l1MjRqN3IweTVrM2VmNHVoaDllMg==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTQ2NS43Mjc4NDUxMTc1NjQ3MzMyNDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4aHhuYWQzYzg2cTNkOGdnc3l1MjRqN3IweTVrM2VmNHVoaDllMg==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjguMzk3ODQ0NzM4NDg0OTc1MzgydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFkM2FyMnBzYTljYTU1cTQ1amczcTZmM2x0bXByMG5kcXFsdHk4Nw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTM2Ny45NTY4OTQ3Njk2OTk1MDc2NDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFkM2FyMnBzYTljYTU1cTQ1amczcTZmM2x0bXByMG5kcXFsdHk4Nw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjcuMzk5OTQ4Njk4ODYzMjU5ODk2dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFlcWduZDdleTBobmhhOHJyZnVranJzYXd1bGhuYTB6YWdjZzZhNA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTM0Ny45OTg5NzM5NzcyNjUxOTc5MjB1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFlcWduZDdleTBobmhhOHJyZnVranJzYXd1bGhuYTB6YWdjZzZhNA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjcuMTQ1NjEwMzczMDYyNDgxMTAxdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEzNXA4Mm5kdWt1dWV6ZXVnYWV0eHgwc2pqOWtud2dwZWdjY3RxcA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTM0Mi45MTIyMDc0NjEyNDk2MjIwMTZ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEzNXA4Mm5kdWt1dWV6ZXVnYWV0eHgwc2pqOWtud2dwZWdjY3RxcA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjcuMDUzNTI3OTE2MjYzMzcxNTIydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEya3YwM3ptbHNxeDh4cGtrMDVkOGU5ZDA1amFuNzZ3eHd0cGRwZA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTM0MS4wNzA1NTgzMjUyNjc0MzA0NDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEya3YwM3ptbHNxeDh4cGtrMDVkOGU5ZDA1amFuNzZ3eHd0cGRwZA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjUuNzk1MDQzNzE0MDkxMjgzMzk0dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtcGU5cmRrN3ljdWpnZTdyOW5janQ0ZWthbWdyZGN5Z3Z6d3FlOA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTMxNS45MDA4NzQyODE4MjU2Njc4NzJ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtcGU5cmRrN3ljdWpnZTdyOW5janQ0ZWthbWdyZGN5Z3Z6d3FlOA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjEuODc1ODM4Njg4Nzg1MDAxNTAzdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEwcGxra212NzU3cGZ5ZHlxYzk3czg3emdxdDg0dnJ5NmR4NnE5aw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTIzNy41MTY3NzM3NzU3MDAwMzAwNjR1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEwcGxra212NzU3cGZ5ZHlxYzk3czg3emdxdDg0dnJ5NmR4NnE5aw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjEuNzQ2NTM3MjI2MDQ2NzAzNTg4dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEwYzZycno1NXVra2FmN3JqZWVyaHB4d3BxZWw0dGxsenM4dmdmcQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTIzNC45MzA3NDQ1MjA5MzQwNzE3NjB1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjEwYzZycno1NXVra2FmN3JqZWVyaHB4d3BxZWw0dGxsenM4dmdmcQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTkuNjcyMjMyMTUxNDA2NzI5NjkydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF1eGxmN212cjhuZXAzZ203dWRmMnU5cmVtbXMyanlqcTZlZTM1Zw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTE5My40NDQ2NDMwMjgxMzQ1OTM4NDB1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF1eGxmN212cjhuZXAzZ203dWRmMnU5cmVtbXMyanlqcTZlZTM1Zw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTguNTg1Njg2MTQ4NDA3MTE3NjE4dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4MGM5OWU4aHVlbWhjamh1ZTRucDhjODA1dzlrOG5udnNjY21mZg==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTE3MS43MTM3MjI5NjgxNDIzNTIzNTJ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4MGM5OWU4aHVlbWhjamh1ZTRucDhjODA1dzlrOG5udnNjY21mZg==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTUuNDg1MzE4MjE1Mzc4NzI4MzM2dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFoZm1ueXRnZjczdDd0NHd6ZGF6ZWp4dHB3ZTJ0bGF5bHc1YW1sMw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTEwOS43MDYzNjQzMDc1NzQ1NjY3MjB1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFoZm1ueXRnZjczdDd0NHd6ZGF6ZWp4dHB3ZTJ0bGF5bHc1YW1sMw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTQuODA3NDAzODUxNDYzODI5OTU0dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF5ODJtNXkzd2V2am5lYW16ZzBwbXg4N2R6YW55eHpodDBrZXB2bg==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTA5Ni4xNDgwNzcwMjkyNzY1OTkwNzJ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF5ODJtNXkzd2V2am5lYW16ZzBwbXg4N2R6YW55eHpodDBrZXB2bg==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTEuMjI5Mjk1ODA0NDA1NjQ5ODUwdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFobmtrcW56d215dzY1Mm11aDZ3ZmVhN3hsZmdwbG55ajBrdTR3NA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTAyNC41ODU5MTYwODgxMTI5OTcwMDh1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFobmtrcW56d215dzY1Mm11aDZ3ZmVhN3hsZmdwbG55ajBrdTR3NA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDcuNzg2Njg2MTQwNjk4MzQ0NzA4dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0MGw2eTJncDNneHZheTZxdG43MHJlN3oyczBnbjU3emw2bnVwcw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "OTU1LjczMzcyMjgxMzk2Njg5NDE2MHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0MGw2eTJncDNneHZheTZxdG43MHJlN3oyczBnbjU3emw2bnVwcw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDQuMzkyNzYyNDA5ODIxOTU2MzM3dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtbTVwNmFrMnc5NGN3cnkwbjQycHgzc3Nhamd5dHhud2Z2ZDR3OA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "ODg3Ljg1NTI0ODE5NjQzOTEyNjczNnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtbTVwNmFrMnc5NGN3cnkwbjQycHgzc3Nhamd5dHhud2Z2ZDR3OA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzQuODEyMzUyNjg3NjE5ODQxNzQydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFmcHZqeWU0cmNxbWRzNnZ2cmp2ZjRwbDhqZnN2NXZrbjBsbGF4cw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "Njk2LjI0NzA1Mzc1MjM5NjgzNDg0OHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFmcHZqeWU0cmNxbWRzNnZ2cmp2ZjRwbDhqZnN2NXZrbjBsbGF4cw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzIuNjk4NTI4MDc3OTgzODM3NDgxdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFnYXJ6NGtqZmdhcjhkd3lwYXl1ZmNhMm11amd0ZnhsdjZrdGUwMw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NjUzLjk3MDU2MTU1OTY3Njc0OTYxNnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFnYXJ6NGtqZmdhcjhkd3lwYXl1ZmNhMm11amd0ZnhsdjZrdGUwMw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjguOTA0ODM5Njg4NzE1NjYzMTU5dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFkNTBrZ3lkbTAyeGc5a3BhZmE4ZTNqd3o4M2MwdXZhZ2t4OW01bg==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTc4LjA5Njc5Mzc3NDMxMzI2MzE4NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFkNTBrZ3lkbTAyeGc5a3BhZmE4ZTNqd3o4M2MwdXZhZ2t4OW01bg==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjYuMjM5MTA2Mzg0NTAyNDcxODYydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE3Z2E5amhhNDVndTB4MDR5cm1mcGpwa3NtcWU0OHd1cHprNWpleA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NTI0Ljc4MjEyNzY5MDA0OTQzNzI0OHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE3Z2E5amhhNDVndTB4MDR5cm1mcGpwa3NtcWU0OHd1cHprNWpleA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjQuNzgwMDE5NzUyNzAzMjQxNTI3dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF0OWZxM3FmbTduZ2F1NWdyOHFnZjVkcGZ6anFnNzlrZjY1Y3UwNA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDk1LjYwMDM5NTA1NDA2NDgzMDU0NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF0OWZxM3FmbTduZ2F1NWdyOHFnZjVkcGZ6anFnNzlrZjY1Y3UwNA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjQuNjAyOTkxMDIxMTQ5NjYzNzEzdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFzcGczMzRxZHN4dG1senFuOXZzaDU2NjQ3N3dkMGhyNTZjanNwag==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDkyLjA1OTgyMDQyMjk5MzI3NDI1NnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFzcGczMzRxZHN4dG1senFuOXZzaDU2NjQ3N3dkMGhyNTZjanNwag==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjQuNDU2MTk1NDgzNTEzMzI0NjA0dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0dTM4Y2w2a25xeHM2dnM3bGo3dnpmdmFwNDJ5eWMzcnVudHJ3Yw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDg5LjEyMzkwOTY3MDI2NjQ5MjA4MHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0dTM4Y2w2a25xeHM2dnM3bGo3dnpmdmFwNDJ5eWMzcnVudHJ3Yw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MjQuNDM5ODQzOTU2MjA3MDU2MjIwdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF6djl6MndxdDM0OGRoeHFuMzh4djhkdnN1NzhjbGU0eHMyY2RmNA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDg4Ljc5Njg3OTEyNDE0MTEyNDQwMHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF6djl6MndxdDM0OGRoeHFuMzh4djhkdnN1NzhjbGU0eHMyY2RmNA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDA3Ljg0MTg3NDU1OTA4MDQyNTU4NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFoNnRkeG1tcGVyYW1kbmc3cWwwcGRoc2dxaDZhMmh3a3hxdGZ5Zw==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NDA3Ljg0MTg3NDU1OTA4MDQyNTU4NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFoNnRkeG1tcGVyYW1kbmc3cWwwcGRoc2dxaDZhMmh3a3hxdGZ5Zw==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTkuMzA2MTg2MjQ2MzQxMDkwMDc5dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFnbm1tZzZtY2MzbmYyNXVyOGE1NXl5am01Zjk1azJnd3pzbDJwOA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "Mzg2LjEyMzcyNDkyNjgyMTgwMTU4NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFnbm1tZzZtY2MzbmYyNXVyOGE1NXl5am01Zjk1azJnd3pzbDJwOA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTkuMjk0NDA1NzkxMzM3NTMxMzMwdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFjdG5sZThhbmp2cnNmN2gyY2R3ZXd3YTM3N3g2M2VjM3VrZmU2aA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "Mzg1Ljg4ODExNTgyNjc1MDYyNjU5MnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFjdG5sZThhbmp2cnNmN2gyY2R3ZXd3YTM3N3g2M2VjM3VrZmU2aA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTguNjA0OTU5MjM3Mjk1MjQ3MTgxdXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtZWU2a3lzeHpwOTlrZnZnazducXg3bHJxZzh0eG13N2thcDlneQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzcyLjA5OTE4NDc0NTkwNDk0MzYxNnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFtZWU2a3lzeHpwOTlrZnZnazducXg3bHJxZzh0eG13N2thcDlneQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTcuOTEwMzg5NTE5MjU0MDM3MzMydXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4aDJnZjlneXZ1bWxncHI5d3M1bjQyNXZobnR2OXJ5c3c5Z3I0cQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzU4LjIwNzc5MDM4NTA4MDc0NjY0MHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF4aDJnZjlneXZ1bWxncHI5d3M1bjQyNXZobnR2OXJ5c3c5Z3I0cQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTcuNDA1NTc4MzkxNDYxNjIxOTM5dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF5a2xzNmRoaDJtanFrOXgwZDNlZTI5ODczc3RmN3d3dmVkY2ptaA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzQ4LjExMTU2NzgyOTIzMjQzODc4NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjF5a2xzNmRoaDJtanFrOXgwZDNlZTI5ODczc3RmN3d3dmVkY2ptaA==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTcuMDczMTE2NDQ0ODM5MTg1OTM1dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0dHMwajQycWtwcjQzYTN0Z3hyN3p6Nmw2emRmN2hkZTNtZjJhZQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MzQxLjQ2MjMyODg5Njc4MzcxODcwNHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjE0dHMwajQycWtwcjQzYTN0Z3hyN3p6Nmw2emRmN2hkZTNtZjJhZQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "OC4zMTA5MDM5NzA2MjQ4NjAyMDd1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFxZTh1dWY1eDY5YzUyNmg0bnp4d3Y0bHRmdHI3M3Y3cW5reXBsYQ==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTY2LjIxODA3OTQxMjQ5NzIwNDE0NHVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFxZTh1dWY1eDY5YzUyNmg0bnp4d3Y0bHRmdHI3M3Y3cW5reXBsYQ==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "Ni42MTQ1MTgwMDkxNDQ1NDI4NjJ1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFlcXU1M3o5bTVta3ptNWVwbXZwM3F2aHo3NzBkanlneWNodWcydg==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "MTMyLjI5MDM2MDE4Mjg5MDg1NzIzMnVzZWk=", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFlcXU1M3o5bTVta3ptNWVwbXZwM3F2aHo3NzBkanlneWNodWcydg==", + "index": true + } + ] + }, + { + "type": "commission", + "attributes": [ + { + "key": "YW1vdW50", + "value": "NC41NTAxOTExNTQwNzQ4NjY1NTR1c2Vp", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFxbXB4bHN3d2s0Mnd5YTY3dDd6c2Fhd2YzdnVyMDNjdWV2c3MwaA==", + "index": true + } + ] + }, + { + "type": "rewards", + "attributes": [ + { + "key": "YW1vdW50", + "value": "OTEuMDAzODIzMDgxNDk3MzMxMDg4dXNlaQ==", + "index": true + }, + { + "key": "dmFsaWRhdG9y", + "value": "c2VpdmFsb3BlcjFxbXB4bHN3d2s0Mnd5YTY3dDd6c2Fhd2YzdnVyMDNjdWV2c3MwaA==", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NzY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NzY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NzY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Nzc3MXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Nzc3MXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "Nzc3MXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXFsNHF6cjg4", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzY4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzY4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzY4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTg5NDV1c2Vp", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTg5NDV1c2Vp", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NTg5NDV1c2Vp", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBxczNrYXgy", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBwZDh6Z21j", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MA==", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBwZDh6Z21j", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjUydXNlaQ==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjUydXNlaQ==", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBwZDh6Z21j", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjUydXNlaQ==", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBwZDh6Z21j", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjkzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzA4dXNlaQ==", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzA4dXNlaQ==", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MzA4dXNlaQ==", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB6cjVoNzQ4", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjAwMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTc4OHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTc4OHVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTc4OHVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXByN3pydGc0", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODQ5MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODQ5MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODQ5MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg2NHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg2NHVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NDg2NHVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB5bG01bWZz", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTg4NTAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTg4NTAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTg4NTAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTM1NnVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTM1NnVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTM1NnVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA5emRxdzV6", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODM1NjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODM1NjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODM1NjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB4djc0YzZh", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXA4M2dwZDgw", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTcxMjAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTU3MHVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBndzlqM2No", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBmbm54eTk5", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjI4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjI4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjI4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1M3VzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1M3VzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1M3VzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAyYXFuanQ2", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB0cWs4OGtn", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB2cDBzaGhk", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBkdWV5ejJs", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXB3ajIzNXlx", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAwMHU5cGVq", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTQ1MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTQ1MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTQ1MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBzOXM3OW5l", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjA4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjA4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "NjA4MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjQ0NXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjQ0NXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MjQ0NXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXAzY3gyc3d0", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "ODEzMDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTIzMXVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBqazRseHE1", + "index": true + } + ] + }, + { + "type": "wei_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "wei_transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTY0MDAwMDAwMDAw", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsYTRqa2R1", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTA1MnVzZWk=", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "c2VuZGVy", + "value": "c2VpMXY0bXg2aG1yZGE1a3VjbnB3ZGpzcXFxcXFxcXFxcXBudHJ0bmF4", + "index": true + } + ] + } + ], + "validator_updates": null, + "consensus_param_updates": { + "block": { + "max_bytes": 22020096, + "max_gas": 10000000, + "max_gas_wanted": 50000000 + }, + "evidence": { + "max_age_num_blocks": 100000, + "max_age_duration": 172800000000000, + "max_bytes": 1048576 + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + } + } + }, + { + "endpoint": "Block", + "arguments": [ + "187688144" + ], + "response": { + "block_id": { + "hash": "ED809DF930894FB505167E8233E5CF74E81E76FF633683CC28B0E23898F75B6B", + "parts": { + "total": 1, + "hash": "C2AB699A4C01616340F39700D9F1BE44AFAB3D78EFC5B8AB818DA97CF334AC58" + } + }, + "block": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "pacific-1", + "height": "187688144", + "time": "2026-01-05T18:48:49.705096943Z", + "last_block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "last_commit_hash": "DECC5A41EC72A0EBB3CA880926AB672CD3B06BA3B38B18518A32C613EB3CF9BF", + "data_hash": "C813F5CD33CE639D3E1DACA248608C25D330E93889992E3D50A0F55BFED58DAD", + "validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "next_validators_hash": "EA5FC5AC3B24B0ED54232378F5357DBBE5C3FFD93F726DFB71FC30C297BE5FF7", + "consensus_hash": "7D0B88F8835DB6E92EC4E959CCD9324052C68794BC42567CFA45FB176ED6679A", + "app_hash": "B7818515F77D243F2FF2ED3E3060E6DEA773B65DFFDB860C4339BCD2DD27A06B", + "last_results_hash": "F2BA124D271707704573A4AA42922BEEBD172671473304B29E319CB78AAC7F8E", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "399548FF09159AF3711DF1EF08CC243C505130B6" + }, + "data": { + "txs": [ + "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" + ] + }, + "evidence": [], + "last_commit": { + "height": "187688143", + "round": 0, + "block_id": { + "hash": "B8E1539AFB3D709EF4945F5707567FDED80A20E66676103F8BCA71445C0360FA", + "parts": { + "total": 1, + "hash": "B592AE49B53E94A322702911A58D19B8D6697E36E4B74949794490E6B75E96EC" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "6CA80EE04179FF609B07F9BBC65C6E47F20D09CA", + "timestamp": "2026-01-05T18:48:49.39828782Z", + "signature": "/sbaRht20zHw58u2RiL8m3gdw/d4IV1QyuP/xN6faPqgn7SE0w+zR8DtA0alnmflf13uLGBUFvwZ8e5tYyzTAA==" + }, + { + "block_id_flag": 2, + "validator_address": "399548FF09159AF3711DF1EF08CC243C505130B6", + "timestamp": "2026-01-05T18:48:49.416880259Z", + "signature": "oQT4nFIYs/NRfunUHQgl+FxrBP7tr0UYI5fl/JGqbkGFcfQlmMZpeJjsLQOU2++sHKeCrN4pJfrOLO5xRbNSDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "7482D68A8C68FD7204273223D90864207B1558B5", + "timestamp": "2026-01-05T18:48:49.419379126Z", + "signature": "h4CrFlNrE7ra7xnsXeuvtT29MKFcy1peJAL6QyzN0HldLpFNQ/YhsC8oZnxM39AIBl8jSVjB3Vo17QPNih8nDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F04B5B9C48B65604A1309E0B0046B4F7CF8C7EF2", + "timestamp": "2026-01-05T18:48:49.440178566Z", + "signature": "DXfosmGYtLL344vUv2zpuqh9oeQCwCvMIBy3OwiFJ8FvPeLDu+OZyQ+9YvX5tMRUAiDpY/Q46+a2iUxSYZI1BA==" + }, + { + "block_id_flag": 2, + "validator_address": "9F1F7B9B3584198F985ADB6AA72037731D2A3C73", + "timestamp": "2026-01-05T18:48:49.421256307Z", + "signature": "cyFy+78m9IoZYy2/HL52s89u/xpFWtlsC0k7jTRZbbxgJyONNE52CTjwolVGqgRvEIVKa1GGk+3WxF4EsJnFDw==" + }, + { + "block_id_flag": 2, + "validator_address": "3D4CEB152CA0271E5A9AF577D67C828A228C87DF", + "timestamp": "2026-01-05T18:48:49.436823294Z", + "signature": "QidGl3TfF1Eu32mTVGp5j3I6/IUdjr43mrY6QXOpcr/a8vM1MB22sbg6MBp+KjHVv9RFRwRO0soUM8uD/ZOJBg==" + }, + { + "block_id_flag": 2, + "validator_address": "59E78E0B1133144460575337FAA2558399E43661", + "timestamp": "2026-01-05T18:48:49.409518086Z", + "signature": "7nOgmfV+r+C7Lt5MHS0eNuCia1Bn5aaz7ZOwDOdfMw01fl3VEGK6vUMgM36CHtYcONZhp/rxGUKMPxPfTOBQAA==" + }, + { + "block_id_flag": 2, + "validator_address": "AA5241DBD04ED2D969216D30C14D408CE3356919", + "timestamp": "2026-01-05T18:48:49.445319702Z", + "signature": "aBokEyZw7Q+nozzecIxwKIrXP1AfxKfcCBtbSMNueDPkgSGENJexX6VMIxEzEQ1IjFELyJk4MLvMVt8cDDyQAg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC60893A39B4E2DB10EC336489C71F2B537A7C65", + "timestamp": "2026-01-05T18:48:49.391370456Z", + "signature": "ilK3eLwRXsonQ1OM+AZGfsjv8MCCujpCDdeZlqp1kzyo3VrPZmX1Oijprl1UcatG7IV2Fablkhhzn5zC9BIvBA==" + }, + { + "block_id_flag": 2, + "validator_address": "B1E0490AAC5CD08248C284378296D86810410591", + "timestamp": "2026-01-05T18:48:49.406078333Z", + "signature": "loji0DQL9Y+mtqagR5410tsD319laBY7O1twrgRw9X/rqcLIeMC47ZtLKFoUVZ9mxq818q5VmpdYemAlisRSDw==" + }, + { + "block_id_flag": 2, + "validator_address": "00D66A1CB50A2473D8F011D369ADB117A527072D", + "timestamp": "2026-01-05T18:48:49.401140543Z", + "signature": "PH4u4SlZWVPEE5k0VG300n4/M8LKb+J1GGHd8Iu7w+a+zn14e8BMRUL41zqOnzGXQSqWgtZO10v1zxngdMGzDw==" + }, + { + "block_id_flag": 2, + "validator_address": "0AB238961ABDBC7C99C6693765DB290420E2ED87", + "timestamp": "2026-01-05T18:48:49.418072293Z", + "signature": "Af4pxMwGyl76MO2B14F5uEQRuCi/Z3qsFkF5SqQhJ2iJGNjVETkapcxpNWta/PlB2HhvaJVkGTK35n0U0ISBBQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E1CA4BCEB36E12283CCAB4A844A97E0C050F005A", + "timestamp": "2026-01-05T18:48:49.418684131Z", + "signature": "7942zAB42jNUzcoXlgs+dhtB3n7WwwFNq7sFrAieUc5J/Ad8u0cjbXpKm0Omrg5UGhaKllg7Okykf9ZRrcF5Ag==" + }, + { + "block_id_flag": 2, + "validator_address": "6E900C94F99B249CD8FB6538969E0D9E099C2F52", + "timestamp": "2026-01-05T18:48:49.416314883Z", + "signature": "rRZqZdCeKFdRhr8VLntaULl1ODxk261WtHFCfcL7/WcfHfu7yUeEYkckRgKQnJgjVizCIBryhD15hkLZpSotBg==" + }, + { + "block_id_flag": 2, + "validator_address": "B016593FC42B4A1988404F3D80AFEF984BD966E2", + "timestamp": "2026-01-05T18:48:49.402207338Z", + "signature": "JrwZ0ux9PeOOscstIbLXtKDznod8yfCJ8I3aXhOJxCfjbDoZOMcHEp82OWylhTifDZJ6df1rZ6bqHhNedotHDQ==" + }, + { + "block_id_flag": 2, + "validator_address": "1394B86452A60711A0D3637E327D7D080A459B76", + "timestamp": "2026-01-05T18:48:49.404573449Z", + "signature": "PGMoQvhT9kLj/M3u74Qzo0RVAzQ6xZy4wgJFg7N7lEdYo+MDZBBicNy7GY/OKqKMeXX/TqQoJGaBQ4uZtFs1Aw==" + }, + { + "block_id_flag": 2, + "validator_address": "AB873FF0A3F0BD6D36712004C61CE8BF5970EB60", + "timestamp": "2026-01-05T18:48:49.431377562Z", + "signature": "+0xQ1vFGsyOZdBELIn2+40lwQ4l84PueY82v5vyHNBtc9M2BAb4GtjqEN+e5yPSIHRQ32DzULjcgdwpD5rilBw==" + }, + { + "block_id_flag": 2, + "validator_address": "314E76481BDEA52CEA72A30BC185B14F97E7E1D5", + "timestamp": "2026-01-05T18:48:49.413176691Z", + "signature": "4Qk07nO+z6AGvu619aabD4P3Kp/eJ6sFT17beV8iqymiKfDcE3LawSkocOR03nN+OYgI1vEY3XMSTBYiqlPHDg==" + }, + { + "block_id_flag": 2, + "validator_address": "BA479C5C63D95550191E3D6434BA557BD5F69508", + "timestamp": "2026-01-05T18:48:49.391503662Z", + "signature": "PuFZidvAPy3vWiAy35eqgzX39H2po6CWkhR5YCkCsD7cxSVF2NFJ7wW1un4mhvw3xLgVpbzpCA8zTBsVAiVLCg==" + }, + { + "block_id_flag": 2, + "validator_address": "40F909929F7FA9D475E2C6F5A94AC9D6D97CF83D", + "timestamp": "2026-01-05T18:48:49.40052186Z", + "signature": "diNLbodlI0wg96BpP2i27uO4y/YNGbSTb9PXLB+EU+S4550EnZRKpge5d1rl+hPUa43wV5MUBe0fdDE7dWU6CA==" + }, + { + "block_id_flag": 2, + "validator_address": "1AEFCC514E41F3DD21F5CE20B7BA3D142EB56256", + "timestamp": "2026-01-05T18:48:49.411004464Z", + "signature": "9N/Otx75V5qnsUoF4pqebNi4KPCFFnpIYodmZD6xcMqSZQmDisG2UZef0N7Kz2f/boluy/su/jobVJirhwc+Cw==" + }, + { + "block_id_flag": 2, + "validator_address": "114C0350B9CE023F98518D9F22A2E2E7548DAF66", + "timestamp": "2026-01-05T18:48:49.432133119Z", + "signature": "wcc7kubtws5Hb3FOdr99XROKhUWCRcdtb98kKJ4+sPEsSlTeI1DAB6P7izdNhTKjaN/gbvWltoi9WO5d9ZgrCA==" + }, + { + "block_id_flag": 2, + "validator_address": "CCC61D60E3DD1121BBBB2EA4C0039F91FD372389", + "timestamp": "2026-01-05T18:48:49.401195263Z", + "signature": "V9tVQcnV4vhJyhKYE6B1FMY6WJCFY3jXHrNDiloFhPcnfL/bT5wTdIweK0VIMkXN2N6r0LlXGIUJlZs2L0BhAA==" + }, + { + "block_id_flag": 2, + "validator_address": "25ABC30B5E07AFD6CA59EAA3495AC44D6B5C3026", + "timestamp": "2026-01-05T18:48:49.414351459Z", + "signature": "qorrktsulEY9CgnodGFGQ8Aa4bnFcxCBPp0F3jWoDuqRhKtLl2NKZSgPefIcMgn1iI4ebAeC4P20O7Bh+iz2DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "922357BD8E69E6119D0630F7ABBBF7C5E3879F2F", + "timestamp": "2026-01-05T18:48:49.433680826Z", + "signature": "oVBa91cRmYkwVMVYBXZEyNETXZUh4gtI5oVVWjMNb7j0hOAnjM7zCfueex9IlUi3AqEuPdFEgtufgNCBhOPSDA==" + }, + { + "block_id_flag": 2, + "validator_address": "A633A4EEB521DD9F09326BF5C945BC24327C6A66", + "timestamp": "2026-01-05T18:48:49.414773774Z", + "signature": "K1OFMypkH2mR60EQ+633ar9jCZrj46SVeGeATotvV8z4CIDBq/WPz4nXQo6AB+/InCfW1hjTtJGxDJBsUKxdAw==" + }, + { + "block_id_flag": 2, + "validator_address": "183388665BAC7D2537A91633FDC9ED5D6F46EF37", + "timestamp": "2026-01-05T18:48:49.429424419Z", + "signature": "7kdJ+3bizEtQXg6HXg7djAE6ecQAz3VHKuyEceQyqtz2/afYvUXwWgokygkfD3EH04c+Jwpl9M/hYUiFSZwRCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "E557DD5ACE79FC5C741275673CB35719F9137DCB", + "timestamp": "2026-01-05T18:48:49.426887237Z", + "signature": "WbIqRay0Vhu/Tr48jir5XBCsGxdSCqee69hxQ3iXT39GzdUXxpTdd4EkmRCtnF4fRS/8CKyXsZu42WvzKAtDCg==" + }, + { + "block_id_flag": 2, + "validator_address": "E58F7A4F8E69795E1B0AFFF2A63C4555930F0CB1", + "timestamp": "2026-01-05T18:48:49.439710162Z", + "signature": "Qmu4+mPYdrM2F1F+xCz/Xtj9OYn3BYoorpKh18+Z0T80Zp38eg4ZyC1iemyyteNMlFX/n2xkVOLeZnsGGMpNCg==" + }, + { + "block_id_flag": 2, + "validator_address": "CC7DC427A5EE1FEA25236DBD78AB8F66DB0AEC22", + "timestamp": "2026-01-05T18:48:49.412414886Z", + "signature": "AkkwCoUjC1P05Lxn9Wsz5twu44ZmuN28RaXaByBR0D48WfFyrFdJAb1slgWmMb9181Q6etul1duxhdr8yujXDg==" + }, + { + "block_id_flag": 2, + "validator_address": "40369FABDD947B4848FD7361B0B824A36CBF19A6", + "timestamp": "2026-01-05T18:48:49.420191652Z", + "signature": "i7B2mItd//aN7z9gz3nnoeUXTO5gdDnU3p8Yw2ixqfjYLq6KE0IxO/kK5V3CZ+rlFqO/JnI5QgHkzSfMMB+oDA==" + }, + { + "block_id_flag": 2, + "validator_address": "F40A639C3BE84EA224492A34B3C741DEC5F28444", + "timestamp": "2026-01-05T18:48:49.445735369Z", + "signature": "8j8c0BsMES1z37ChyRsP22yClG3qwaS1p48Pd5s4JfsTerzdUAWB4ISY893DXxH84wBOPrVCYkOGOnD9wH0sAw==" + }, + { + "block_id_flag": 2, + "validator_address": "8E4218ECD657CCD6FDE32C0FC0C4AC3366B71E5D", + "timestamp": "2026-01-05T18:48:49.403911864Z", + "signature": "temCJjI666aZwIh4qPJDB7Dh3WYm13So6KiHmypmwJsQmAJBfxKibCHrBrgehdc+N/WEz0DQZiBHw3AHc1GpDw==" + }, + { + "block_id_flag": 2, + "validator_address": "F0E0BFD3FEF2EC20DC7FFFA150BA9E9FECA55143", + "timestamp": "2026-01-05T18:48:49.394111876Z", + "signature": "XkKX+xVf+SmeouACTvSVrTj1JbQ4gYaClh/ywqlthj1HFZurp+YAMz02Jq03ZDWwgLZ9k+iiPyHHXBc4UBv3DQ==" + }, + { + "block_id_flag": 2, + "validator_address": "8F7E88D0344F74BC17822506E7E29B220AD221DA", + "timestamp": "2026-01-05T18:48:49.426815066Z", + "signature": "zybIQBMYJHyV21a+gXdOc3e1BLKGuLpPbeSm+kwOsHTGylMK5rTcdY+4nqC0YXBXJn5jDsMgHChCLNgJ2m34CA==" + }, + { + "block_id_flag": 2, + "validator_address": "E06A77383534E7157F4BE3C873B25A62E7FF6428", + "timestamp": "2026-01-05T18:48:49.449723146Z", + "signature": "z8Cqe/XBzHtQw5oQ79Yi2R7S8fbLUtFjZYfLBEPniEAZUwi5rSb1LnXdcofDKgXnTnOpXZdFTm/U3uQot2COCQ==" + }, + { + "block_id_flag": 2, + "validator_address": "F878712942EE2566B849ADB75DA7993FD93AD71D", + "timestamp": "2026-01-05T18:48:49.445707809Z", + "signature": "2ugvX4rNlCaBIVkCPA+Vtz8RbY5Csp7yqBgMCLh/Hj7/XGnRgPjp8nxfkrBB7TNyz9swyye02d4xjtuXIYwJAA==" + }, + { + "block_id_flag": 2, + "validator_address": "507A1930FE00C2B4D3DAE52C7463DCDA2468A5ED", + "timestamp": "2026-01-05T18:48:49.412219661Z", + "signature": "Q6kvRQU/+ypYUVBD0mK2vzxGxPvC3wsUgMejrCGGaKYgMxYxJgXTHDDMr7vvfZN6LdG8dyHm/R7RCG1m1G9LDA==" + }, + { + "block_id_flag": 2, + "validator_address": "174071DA88C6E60CC74E5DA0DCBE80A7CF300B62", + "timestamp": "2026-01-05T18:48:49.415049646Z", + "signature": "qG/z34X+7DZLnhAbQb5b3E7YwW3epsYQtqwXWUcuq4EO/acO8tIvFIZKY5zkQzOnmxIFoWI7MYOfaVGwcvwUAA==" + }, + { + "block_id_flag": 2, + "validator_address": "59AB86020766FCDC61BB0139639D1646760F21D9", + "timestamp": "2026-01-05T18:48:49.412468053Z", + "signature": "eOTDi5RZIQClsMYAQGtsvSZW6yfFPvCUbqDTQhydS6Kl+Gj5nt2PBRjX51AitA4xikW0VDIVw/sZNaPZ5SLSDg==" + } + ] + } + } + } + }, + { + "endpoint": "Validators", + "arguments": [ + "187688143" + ], + "response": { + "block_height": "187688143", + "validators": [ + { + "address": "6CA80EE04179FF609B07F9BBC65C6E47F20D09CA", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0yfEshZsklnn/J/KDaF+gDWS31Yrap6aUG5pt/nk6iw=" + }, + "voting_power": "273180421", + "proposer_priority": "40076322" + }, + { + "address": "399548FF09159AF3711DF1EF08CC243C505130B6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SDIvv/p97k5qKdTVRGDzzX2NmuQrBRLo1BXCsHpK/Xo=" + }, + "voting_power": "220630572", + "proposer_priority": "1902241486" + }, + { + "address": "7482D68A8C68FD7204273223D90864207B1558B5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LoVc5D8EoLQwzFKKDpJmD+kyYAqBiLdkDgfWcPkXuKY=" + }, + "voting_power": "191691843", + "proposer_priority": "-1054306828" + }, + { + "address": "F04B5B9C48B65604A1309E0B0046B4F7CF8C7EF2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7uHtOE4oYn6GDGHVjKT7kW00rZ+XzLlcZyB4CpfuEN8=" + }, + "voting_power": "186226702", + "proposer_priority": "-1572020615" + }, + { + "address": "9F1F7B9B3584198F985ADB6AA72037731D2A3C73", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MrIsEDbhfdT9I8KfOXpTBEpMPp6W90WRSuSYwP74zSc=" + }, + "voting_power": "182493140", + "proposer_priority": "-693057424" + }, + { + "address": "3D4CEB152CA0271E5A9AF577D67C828A228C87DF", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "6/QDop0myVxsfe9lE0vvpVS32iLGxrZa43mBHIElzTU=" + }, + "voting_power": "174487798", + "proposer_priority": "955409546" + }, + { + "address": "59E78E0B1133144460575337FAA2558399E43661", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "jSGbExRc1FmlYlA/xb+z4+IVfL1kop/lUC1pCAIcl/U=" + }, + "voting_power": "166728466", + "proposer_priority": "2101400899" + }, + { + "address": "AA5241DBD04ED2D969216D30C14D408CE3356919", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0ORlqiUL6gT9CAGl2gND44InIAZMQFYQL2a1NAVi8Xs=" + }, + "voting_power": "166194427", + "proposer_priority": "1414305413" + }, + { + "address": "CC60893A39B4E2DB10EC336489C71F2B537A7C65", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dkC5cblcgpq72mlmVvisMbzodGZD1SNoJlGdDuAA7BQ=" + }, + "voting_power": "155108476", + "proposer_priority": "1568688855" + }, + { + "address": "B1E0490AAC5CD08248C284378296D86810410591", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xmd0qoOv2BW8LxdZGw2PPrYowOeIfgPR1JEA/OGgCIs=" + }, + "voting_power": "152845508", + "proposer_priority": "-311648751" + }, + { + "address": "00D66A1CB50A2473D8F011D369ADB117A527072D", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LwEE6fOUE1oYGWiBYoZOCtVXC8NaeeCzh4mB/gVjn0M=" + }, + "voting_power": "152268735", + "proposer_priority": "-1308281296" + }, + { + "address": "0AB238961ABDBC7C99C6693765DB290420E2ED87", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "rMExS+ZB/vsFU7gA8Cx1reMRt7oBYQzu+asldMMiZnE=" + }, + "voting_power": "152059916", + "proposer_priority": "-1681120507" + }, + { + "address": "E1CA4BCEB36E12283CCAB4A844A97E0C050F005A", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A0MMRysC7dwAXaSzZH+CUZjIMBH7Sp2z2hMFFH7u5wM=" + }, + "voting_power": "149206002", + "proposer_priority": "-873875896" + }, + { + "address": "6E900C94F99B249CD8FB6538969E0D9E099C2F52", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "OtbaqI30NGTZ2FszlMZMsFZJS3MR/tP6jptIBl5jdsM=" + }, + "voting_power": "140318267", + "proposer_priority": "655949487" + }, + { + "address": "B016593FC42B4A1988404F3D80AFEF984BD966E2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "N3S+1NrLqHMzwh7zFC9LF0M65w8HPPwiUxqKbjtuaT8=" + }, + "voting_power": "140025045", + "proposer_priority": "689240383" + }, + { + "address": "1394B86452A60711A0D3637E327D7D080A459B76", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "++3mre0cFaNv5PSgJKcA7Q+IGy8CNMJQbJusPUmsa1o=" + }, + "voting_power": "135321062", + "proposer_priority": "-1493791916" + }, + { + "address": "AB873FF0A3F0BD6D36712004C61CE8BF5970EB60", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NSmEAq1EJOy2GHBG0JD1H/mZBioGlS7m89ybDF8wfiU=" + }, + "voting_power": "132857059", + "proposer_priority": "-2096676133" + }, + { + "address": "314E76481BDEA52CEA72A30BC185B14F97E7E1D5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ptDdWZy82O2A3hTtOgDmGJ+w+eSuEC2KI7DM1bu2bKQ=" + }, + "voting_power": "125826233", + "proposer_priority": "-375931987" + }, + { + "address": "BA479C5C63D95550191E3D6434BA557BD5F69508", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P3MLnMNN/76GwQiCDHiniyNhRJ2sMPvtKxmvS8l4MyI=" + }, + "voting_power": "124288900", + "proposer_priority": "1197005715" + }, + { + "address": "40F909929F7FA9D475E2C6F5A94AC9D6D97CF83D", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "M2rUV/CXMQlwRRIJTKGw5xZCF9gMD1xpiOZF5RxSJ3g=" + }, + "voting_power": "116174684", + "proposer_priority": "-1029662247" + }, + { + "address": "1AEFCC514E41F3DD21F5CE20B7BA3D142EB56256", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "U+wVEMmlQZpQ6wIDsVSYSHqrb96A9UoOzr+GcqHBIzw=" + }, + "voting_power": "108367743", + "proposer_priority": "1713254076" + }, + { + "address": "114C0350B9CE023F98518D9F22A2E2E7548DAF66", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "mGES1N+t0yaRV8z4V468uybVLeeG8VEGw/q/fJtsiv4=" + }, + "voting_power": "100671209", + "proposer_priority": "34896277" + }, + { + "address": "CCC61D60E3DD1121BBBB2EA4C0039F91FD372389", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "YbCfN11Dy1Gkt1jOSWg+WUUXtoAisSwINbuJcPUjX6M=" + }, + "voting_power": "78945338", + "proposer_priority": "-629193042" + }, + { + "address": "25ABC30B5E07AFD6CA59EAA3495AC44D6B5C3026", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "e9WkCDidWKDRqFOm5SKif4Cl2NTN2d3plHR+6ySP+ps=" + }, + "voting_power": "74151735", + "proposer_priority": "1230891349" + }, + { + "address": "922357BD8E69E6119D0630F7ABBBF7C5E3879F2F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "CUHKjB7mevZjuNEeJDID5E0s76J33f13H8grrGGBvRU=" + }, + "voting_power": "65548639", + "proposer_priority": "-496535226" + }, + { + "address": "A633A4EEB521DD9F09326BF5C945BC24327C6A66", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tV2PWDXaQoXmYrVSk9C7QUgW8xoMSSYlSFcscaAQAVg=" + }, + "voting_power": "59503451", + "proposer_priority": "1610853521" + }, + { + "address": "183388665BAC7D2537A91633FDC9ED5D6F46EF37", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7b5yjJcnmRHWQvmvs4Z4tw27a+0nnR/QepCbG8XO2fg=" + }, + "voting_power": "56194623", + "proposer_priority": "-383430589" + }, + { + "address": "E557DD5ACE79FC5C741275673CB35719F9137DCB", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "IzcDlGjx4lf3viuFX723LCSlBCwB0tfxLlpnHfr+8IA=" + }, + "voting_power": "55793168", + "proposer_priority": "-1739035387" + }, + { + "address": "E58F7A4F8E69795E1B0AFFF2A63C4555930F0CB1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "rVaaa8fs15t7M2GY462cE90w5njr+jP25mIu/NRuhpw=" + }, + "voting_power": "55460274", + "proposer_priority": "-329457033" + }, + { + "address": "CC7DC427A5EE1FEA25236DBD78AB8F66DB0AEC22", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tJE+Y7v3ZjxXVjxT0GbNP7IPW+JFceHcSpr7eQKyAbE=" + }, + "voting_power": "55423193", + "proposer_priority": "-1426770163" + } + ], + "count": "30", + "total": "40" + } + } + ] + }, + "receipt": { + "traces": [ + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x2deb30545651ea6402bb5852883a5f37898eeaea", + "cumulativeGasUsed": "0x563ee", + "effectiveGasPrice": "0x51f4d5c00", + "from": "0x3ffeaf16afb4407ca99f87ed321ba0c41257db10", + "to": "0x2deb30545651ea6402bb5852883a5f37898eeaea", + "gasUsed": "0x563ee", + "status": "0x1", + "type": "0x0", + "transactionHash": "0x76b742a7c2b918f0aa2526f923dd9475ddd06c912d00c6988a81974e6c64e825", + "transactionIndex": "0x1f" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x0d742a9b4d766e256f0c7dd5bbe832337827beb7", + "cumulativeGasUsed": "0x5057e0", + "effectiveGasPrice": "0x2cb417800", + "from": "0x63b9f25148ccc5337f0a889e8b3f0f8c9130c2fa", + "to": "0x0d742a9b4d766e256f0c7dd5bbe832337827beb7", + "gasUsed": "0x4af3f2", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c", + "transactionIndex": "0x20" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": null, + "cumulativeGasUsed": "0x50a9e8", + "effectiveGasPrice": "0x2cb417800", + "from": "0xb200d8e3192dea48b8e781303d740457ac42eba5", + "to": "0x965335095cdd78cfe1023dfbc450261d88f48f87", + "gasUsed": "0x5208", + "status": "0x1", + "type": "0x0", + "transactionHash": "0xc0117400bb37525905d8c17da64138538ec44ddec7b94ace9ef8fc708941106c", + "transactionIndex": "0x21" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x2deecf2a05f735890eb3ea085d55cec8f1a93895", + "cumulativeGasUsed": "0x511787", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x81c7a9bd72c3235d1252c36c70f1f238cdbe10c4", + "to": "0x2deecf2a05f735890eb3ea085d55cec8f1a93895", + "gasUsed": "0x6d9f", + "status": "0x1", + "type": "0x0", + "transactionHash": "0xd2a783c4dbf6921d66b76e21e648bd00bd2452099a9d5871fd38cbea102313a1", + "transactionIndex": "0x22" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x0501a7af3a1c447c411a71f292c77be8812f6a68", + "cumulativeGasUsed": "0x5392af", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0xfbbea7b8cf51aa0550149a0d12a0d39f2434ac9c", + "to": "0x0501a7af3a1c447c411a71f292c77be8812f6a68", + "gasUsed": "0x27b28", + "status": "0x1", + "type": "0x1", + "transactionHash": "0xaf915668512e79626b3d0fc7c6782c387b809a7fc2382bc3822fabf173125563", + "transactionIndex": "0x23" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0xec9a3f6678048dbabf3fbac760e63a7b3dad4a69", + "cumulativeGasUsed": "0x5a5242", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x00e65562dc6805f9ef20a3f84dd990eb7430a8f1", + "to": "0xec9a3f6678048dbabf3fbac760e63a7b3dad4a69", + "gasUsed": "0x6bf93", + "status": "0x0", + "type": "0x0", + "transactionHash": "0xaa0678b68ef79d8825df8f4406e01583933d1c659a8c34f1d1d772586d40e16c", + "transactionIndex": "0x24" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x5ba0761ff644560529b0f54362c8f6024175928b", + "cumulativeGasUsed": "0x5c1f31", + "effectiveGasPrice": "0x2ad741300", + "from": "0xaa7bf43c6a26bd7f17718444e1f88fbb4a78afaa", + "to": "0x5ba0761ff644560529b0f54362c8f6024175928b", + "gasUsed": "0x1ccef", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xa26c4cca20e62eb234f7d92e88ba49d9038ec0ca85e89c3f7a12bfc035d16c3a", + "transactionIndex": "0x25" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "cumulativeGasUsed": "0x5e3e35", + "effectiveGasPrice": "0x2a1885100", + "from": "0xeef72b050607f6587619d198c4e24685aa5a8b6b", + "to": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "gasUsed": "0x21f04", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x8138e047f70f7a75077103d59c19a66d4428bf4f15060aed3dcd4432577ab8d7", + "transactionIndex": "0x26" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "cumulativeGasUsed": "0x605d45", + "effectiveGasPrice": "0x2a1885100", + "from": "0xb6ee488b3dcab9a0321027ccf66379929db3b5dc", + "to": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "gasUsed": "0x21f10", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x964848c3686665ad08d9deedc2ef10976557f28b25fe3387d4a7281fd7b4a9dc", + "transactionIndex": "0x27" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "cumulativeGasUsed": "0x627c55", + "effectiveGasPrice": "0x2a1885100", + "from": "0x2a297018c1075e7caf80e23fc17cc84bfde983c2", + "to": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "gasUsed": "0x21f10", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xf15b6ee2c7c4fc220564d9ecd673c6e44088dac4a21f56edb876e0a8b85bbdaf", + "transactionIndex": "0x28" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x63f241", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x6e67b8bd53a99c87c632a04b94c260921900d1d4", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x175ec", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x8dbfc873e564fb177a458dcc0a6b8e564f68ab050515178ee52d971a6c300e62", + "transactionIndex": "0x29" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x656845", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x04caf6385858f418bd06b695e75710b117a94177", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x17604", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x8ada955983a893410705f2b1088e442c03110db219ddedc7e76cd3159be7bb07", + "transactionIndex": "0x2a" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x671db4", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x5fbada9cab723458bdd6482f57fedea847fd7ee5", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b56f", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x3c61a1e174b2d71f0d6ad8191b27257f5c430d57c4cdddc0e35efd8b5a130a85", + "transactionIndex": "0x2b" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x6893a0", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x9e3f339f950744b58357229d6dfcd248f462b71c", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x175ec", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xea595373de78186b2c1a1d285f46a0df789044818b5883bab6141626d7791ae2", + "transactionIndex": "0x2c" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x6a490f", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x73c53b08659908e9a061ab52c732b25657a6294c", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b56f", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x06c7ac2e18265d3be5d4d169499c12d107dbf6e2e6d11443f9e2e048c4279b1c", + "transactionIndex": "0x2d" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x6bfe7e", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x8848896664c69a9f648858b9885356b5d006fcc5", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b56f", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x96714cf0534b232041ab59bd59519b472aefd81495dc289c5abecfa663fac3e8", + "transactionIndex": "0x2e" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x6db3ed", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x3b45b3193eee3f91a9fb7d8057707c127e39b2d2", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b56f", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xfa001575cf9218ce9917a49694e10c84a0e9aa897951407ba144dab04186e49c", + "transactionIndex": "0x2f" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x6f6968", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0xcde001e99f6d4f1ef666534f851fa7e93b898c4e", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b57b", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x2a919b622be379884b28a98acb5eb5c67d1bfba43de2d51a6d325122ee0bd92c", + "transactionIndex": "0x30" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0xd9834d7caa2acf81c40e7aac645cf9a57cb14bcd", + "cumulativeGasUsed": "0x72cde0", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x19bc77949ac3d75a3ca83b5c2fc249b828b9fc63", + "to": "0xd9834d7caa2acf81c40e7aac645cf9a57cb14bcd", + "gasUsed": "0x36478", + "status": "0x1", + "type": "0x2", + "transactionHash": "0x6c1cd7982c8bf652ecd1c3eee4480bbd257273dc5db6edc646a7a5ef079d1150", + "transactionIndex": "0x31" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x74834f", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0x6a249e4a70ca5eb8d752d6e908b2af6683d87e25", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x1b56f", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xacbd882344fc73a372886f113bbe79e5e0f9fc764728dfc5daf433953219c7e6", + "transactionIndex": "0x32" + }, + { + "blockNumber": "0xb2fe4d0", + "contractAddress": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "cumulativeGasUsed": "0x75f93b", + "effectiveGasPrice": "0x28fa6ae00", + "from": "0xddf36429abd522c4447a8f832271c08eaf3c08de", + "to": "0x005b643728f513091ad6bcf77e13d7b664429b87", + "gasUsed": "0x175ec", + "status": "0x1", + "type": "0x2", + "transactionHash": "0xe36cef616e24fcd4e1a9e21ed913da748cc312cfcd94e9a5434d196f10c0398c", + "transactionIndex": "0x33" + } + ] + } + } +} \ No newline at end of file diff --git a/evmrpc/tests/regression_test.go b/evmrpc/tests/regression_test.go index 589edca4b7..2365944407 100644 --- a/evmrpc/tests/regression_test.go +++ b/evmrpc/tests/regression_test.go @@ -97,7 +97,7 @@ func Test0x78b377a6459b9ad6a0f64a858ea7afe90dc00a7bba0f0535758572ba1fe59e26(t *t testTx(t, "0x78b377a6459b9ad6a0f64a858ea7afe90dc00a7bba0f0535758572ba1fe59e26", "v5.5.2", - "0x182b0", + "0x18aaf", "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004563918244f40000000000000000000000000000000000000000000000000e9fc7a6844505c1bc07", false, ) @@ -143,6 +143,16 @@ func Test0xd09db4e79993c42eda67b45ca2fd5ac1e4cc60284a03335a08bb91d5b3800d84(t *t ) } +func Test0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c(t *testing.T) { + testTx(t, + "0x8d47010fec64a987e4bb03b358782404a4405596eee90b6a976f2e66383e485c", + "v6.2.6", + "0x4af3f2", + "", + false, + ) +} + func Test169638844(t *testing.T) { testBlock( t, diff --git a/evmrpc/tests/utils.go b/evmrpc/tests/utils.go index 63e5d0fd82..4fcedfdf8a 100644 --- a/evmrpc/tests/utils.go +++ b/evmrpc/tests/utils.go @@ -19,6 +19,7 @@ import ( "github.com/gogo/protobuf/proto" "github.com/sei-protocol/sei-chain/app" "github.com/sei-protocol/sei-chain/evmrpc" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" seiutils "github.com/sei-protocol/sei-chain/utils" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -137,7 +138,7 @@ func setupTestServer( mockClient *MockClient, ) TestServer { port := int(portProvider.Add(1)) - cfg := evmrpc.DefaultConfig + cfg := evmrpcconfig.DefaultConfig cfg.HTTPEnabled = true cfg.HTTPPort = port s, err := evmrpc.NewEVMHTTPServer( diff --git a/evmrpc/tracers.go b/evmrpc/tracers.go index e43c3ecd2d..06fbb193a4 100644 --- a/evmrpc/tracers.go +++ b/evmrpc/tracers.go @@ -20,6 +20,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/hashicorp/golang-lru/v2/expirable" "github.com/sei-protocol/sei-chain/app/legacyabci" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/state" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -69,7 +70,7 @@ func NewDebugAPI( app *baseapp.BaseApp, antehandler sdk.AnteHandler, connectionType ConnectionType, - debugCfg Config, + debugCfg evmrpcconfig.Config, globalBlockCache BlockCache, cacheCreationMutex *sync.Mutex, watermarks *WatermarkManager, @@ -109,7 +110,7 @@ func NewSeiDebugAPI( app *baseapp.BaseApp, antehandler sdk.AnteHandler, connectionType ConnectionType, - debugCfg Config, + debugCfg evmrpcconfig.Config, globalBlockCache BlockCache, cacheCreationMutex *sync.Mutex, watermarks *WatermarkManager, diff --git a/evmrpc/tracers_test.go b/evmrpc/tracers_test.go index 7cf53de9c9..172fe3e837 100644 --- a/evmrpc/tracers_test.go +++ b/evmrpc/tracers_test.go @@ -18,7 +18,7 @@ func TestTraceTransaction(t *testing.T) { result := resObj["result"].(map[string]interface{}) require.Equal(t, "0x5b4eba929f3811980f5ae0c5d04fa200f837df4e", strings.ToLower(result["from"].(string))) require.Equal(t, "0x3e8", result["gas"]) - require.Equal(t, "0x", result["input"]) + require.Equal(t, "0x616263", result["input"]) // hex of "abc" (Data field in test tx) require.Contains(t, result["error"].(string), "intrinsic gas too low") require.Equal(t, "0x0000000000000000000000000000000000010203", result["to"]) if callType, ok := result["type"]; ok { diff --git a/evmrpc/worker_pool.go b/evmrpc/worker_pool.go index 4cd6a49629..1d71537569 100644 --- a/evmrpc/worker_pool.go +++ b/evmrpc/worker_pool.go @@ -4,29 +4,9 @@ import ( "fmt" "runtime" "sync" -) + "time" -const ( - // WorkerBatchSize is the number of blocks processed in each batch. - // Used in filter.go for batch processing of block queries. - WorkerBatchSize = 100 - - // DefaultWorkerQueueSize is the default size of the task queue. - // This represents the number of tasks (not blocks) that can be queued. - // Total capacity = DefaultWorkerQueueSize * WorkerBatchSize blocks - // Example: 1000 tasks * 100 blocks/task = 100,000 blocks can be buffered - // - // Memory footprint estimate: - // - Queue channel overhead: ~8KB (1000 * 8 bytes per channel slot) - // - Each task closure: ~24 bytes - // - Total queue memory: ~32KB (negligible) - // Note: Actual memory usage depends on block data processed by workers - DefaultWorkerQueueSize = 1000 - - // MaxWorkerPoolSize caps the number of workers to prevent excessive - // goroutine creation on high-core machines. Tasks are primarily I/O bound - // (fetching and processing block logs), so 2x CPU cores can be excessive. - MaxWorkerPoolSize = 64 + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" ) // WorkerPool manages a pool of goroutines for concurrent task execution @@ -38,6 +18,9 @@ type WorkerPool struct { wg sync.WaitGroup closed bool mu sync.RWMutex + + // Embedded metrics for backpressure and observability + Metrics *WorkerPoolMetrics } var ( @@ -75,17 +58,23 @@ func GetGlobalWorkerPool() *WorkerPool { func NewWorkerPool(workers, queueSize int) *WorkerPool { // Apply defaults if invalid if workers <= 0 { - workers = min(MaxWorkerPoolSize, runtime.NumCPU()*2) + workers = min(evmrpcconfig.MaxWorkerPoolSize, runtime.NumCPU()*2) } if queueSize <= 0 { - queueSize = DefaultWorkerQueueSize + queueSize = evmrpcconfig.DefaultWorkerQueueSize } - return &WorkerPool{ + wp := &WorkerPool{ workers: workers, taskQueue: make(chan func(), queueSize), done: make(chan struct{}), + Metrics: &WorkerPoolMetrics{ + windowStart: time.Now(), + }, } + wp.Metrics.TotalWorkers.Store(int32(workers)) //nolint:gosec // G115: safe, max is 64 + wp.Metrics.QueueCapacity.Store(int32(queueSize)) //nolint:gosec // G115: safe, max is 1000 + return wp } // Start initializes and starts the worker goroutines @@ -106,15 +95,16 @@ func (wp *WorkerPool) start() { } }() // The worker will exit gracefully when the taskQueue is closed and drained. - for task := range wp.taskQueue { + for wrappedTask := range wp.taskQueue { func() { defer func() { if r := recover(); r != nil { // Log the panic but continue processing other tasks fmt.Printf("Task recovered from panic: %v\n", r) + wp.Metrics.RecordTaskPanicked() } }() - task() + wrappedTask() }() } }() @@ -122,6 +112,39 @@ func (wp *WorkerPool) start() { }) } +// SubmitWithMetrics submits a task with full metrics tracking +func (wp *WorkerPool) SubmitWithMetrics(task func()) error { + // Check if pool is closed first + wp.mu.RLock() + if wp.closed { + wp.mu.RUnlock() + return fmt.Errorf("worker pool is closing") + } + wp.mu.RUnlock() + + queuedAt := time.Now() + + // Wrap the task with metrics + wrappedTask := func() { + startedAt := time.Now() + wp.Metrics.RecordTaskStarted(queuedAt) + defer wp.Metrics.RecordTaskCompleted(startedAt) + task() + } + + select { + case wp.taskQueue <- wrappedTask: + wp.Metrics.RecordTaskSubmitted() + return nil + case <-wp.done: + return fmt.Errorf("worker pool is closing") + default: + // Queue is full - fail fast + wp.Metrics.RecordTaskRejected() + return fmt.Errorf("worker pool queue is full") + } +} + // Submit submits a task to the worker pool with fail-fast behavior // Returns error if queue is full or pool is closing func (wp *WorkerPool) Submit(task func()) error { @@ -168,3 +191,17 @@ func (wp *WorkerPool) WorkerCount() int { func (wp *WorkerPool) QueueSize() int { return cap(wp.taskQueue) } + +// QueueDepth returns the current number of tasks in the queue +func (wp *WorkerPool) QueueDepth() int { + return len(wp.taskQueue) +} + +// QueueUtilization returns the percentage of queue capacity in use +func (wp *WorkerPool) QueueUtilization() float64 { + cap := cap(wp.taskQueue) + if cap == 0 { + return 0 + } + return float64(len(wp.taskQueue)) / float64(cap) * 100 +} diff --git a/evmrpc/worker_pool_metrics.go b/evmrpc/worker_pool_metrics.go new file mode 100644 index 0000000000..d6b30ee799 --- /dev/null +++ b/evmrpc/worker_pool_metrics.go @@ -0,0 +1,984 @@ +package evmrpc + +import ( + "context" + "fmt" + "os" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/cosmos/cosmos-sdk/telemetry" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/metric" +) + +// Environment variable to enable debug metrics printing to stdout +// Set EVM_DEBUG_METRICS=true to enable periodic metrics printing +const EVMDebugMetricsEnvVar = "EVM_DEBUG_METRICS" + +// IsDebugMetricsEnabled checks if debug metrics printing is enabled via environment variable +func IsDebugMetricsEnabled() bool { + val := os.Getenv(EVMDebugMetricsEnvVar) + return strings.ToLower(val) == "true" || val == "1" +} + +// Error type constants for categorization +const ( + ErrTypeRangeTooLarge = "range_too_large" + ErrTypeTimeout = "timeout" + ErrTypeRateLimited = "rate_limited" + ErrTypeBackpressure = "backpressure" + ErrTypeIOSaturated = "io_saturated" + ErrTypeBlockNotFound = "block_not_found" + ErrTypeQueueFull = "queue_full" + ErrTypeOther = "other" +) + +// WorkerPoolMetrics tracks worker pool performance metrics +type WorkerPoolMetrics struct { + // Worker pool stats + TotalWorkers atomic.Int32 + ActiveWorkers atomic.Int32 + QueueCapacity atomic.Int32 + QueueDepth atomic.Int32 + PeakQueueDepth atomic.Int32 + TasksSubmitted atomic.Int64 + TasksCompleted atomic.Int64 + TasksRejected atomic.Int64 // Queue full rejections + TasksPanicked atomic.Int64 + TotalWaitTimeNs atomic.Int64 // Total time tasks spent waiting in queue + TotalExecTimeNs atomic.Int64 // Total task execution time + + // DB Semaphore stats + DBSemaphoreCapacity atomic.Int32 + DBSemaphoreAcquired atomic.Int32 + DBSemaphoreWaitTimeNs atomic.Int64 + DBSemaphoreWaitCount atomic.Int64 + + // eth_getLogs specific stats + GetLogsRequests atomic.Int64 + GetLogsErrors atomic.Int64 + GetLogsSuccess atomic.Int64 // Successful requests + GetLogsBlockRangeSum atomic.Int64 // Sum of block ranges for average calculation + GetLogsLatencySumNs atomic.Int64 // Sum of latencies for average calculation + GetLogsPeakRange atomic.Int64 + GetLogsMaxLatencyNs atomic.Int64 // Max latency observed + + // Error type breakdown + ErrRangeTooLarge atomic.Int64 + ErrTimeout atomic.Int64 + ErrRateLimited atomic.Int64 + ErrBackpressure atomic.Int64 + ErrIOSaturated atomic.Int64 + ErrBlockNotFound atomic.Int64 + ErrQueueFull atomic.Int64 + ErrOther atomic.Int64 + + // Block range distribution buckets (total requests) + RangeBucket1to10 atomic.Int64 // 1-10 blocks + RangeBucket11to100 atomic.Int64 // 11-100 blocks + RangeBucket101to500 atomic.Int64 // 101-500 blocks + RangeBucket501to1000 atomic.Int64 // 501-1000 blocks + RangeBucket1001to2000 atomic.Int64 // 1001-2000 blocks + RangeBucketOver2000 atomic.Int64 // >2000 blocks + + // Block range success counts (for calculating success rate per bucket) + RangeBucket1to10Success atomic.Int64 + RangeBucket11to100Success atomic.Int64 + RangeBucket101to500Success atomic.Int64 + RangeBucket501to1000Success atomic.Int64 + RangeBucket1001to2000Success atomic.Int64 + RangeBucketOver2000Success atomic.Int64 + + // Subscription stats + ActiveSubscriptions atomic.Int32 + SubscriptionErrors atomic.Int64 + + // Time window for TPS calculation + windowStart time.Time + windowRequests atomic.Int64 + mu sync.RWMutex +} + +var ( + metricsPrinterOnce sync.Once + metricsStopOnce sync.Once + metricsStopChan chan struct{} +) + +var ( + meter = otel.Meter("evmrpc_workerpool") + + otelMetrics = struct { + workersTotal metric.Int64Gauge + workersActive metric.Int64Gauge + workersIdle metric.Int64Gauge + queueCapacity metric.Int64Gauge + queueDepth metric.Int64Gauge + queuePeak metric.Int64Gauge + queueUtilizationPct metric.Float64Gauge + tasksSubmittedTotal metric.Int64Gauge + tasksCompletedTotal metric.Int64Gauge + tasksRejectedTotal metric.Int64Gauge + tasksPanickedTotal metric.Int64Gauge + dbSemaphoreCapacity metric.Int64Gauge + dbSemaphoreInUse metric.Int64Gauge + dbSemaphoreAvailable metric.Int64Gauge + dbSemaphoreWaitCount metric.Int64Gauge + subscriptionsActive metric.Int64Gauge + getLogsRequestsTotal metric.Int64Gauge + getLogsSuccessTotal metric.Int64Gauge + getLogsErrorsTotal metric.Int64Gauge + getLogsTPS metric.Float64Gauge + getLogsAvgBlockRange metric.Float64Gauge + getLogsPeakBlockRange metric.Int64Gauge + getLogsAvgLatencyMs metric.Float64Gauge + getLogsMaxLatencyMs metric.Float64Gauge + errRangeTooLarge metric.Int64Gauge + errRateLimited metric.Int64Gauge + errBackpressure metric.Int64Gauge + avgQueueWaitMs metric.Float64Gauge + avgExecTimeMs metric.Float64Gauge + avgDBWaitMs metric.Float64Gauge + }{ + workersTotal: must(meter.Int64Gauge( + "evmrpc_workerpool_workers_total", + metric.WithDescription("Total worker count"), + metric.WithUnit("{count}"), + )), + workersActive: must(meter.Int64Gauge( + "evmrpc_workerpool_workers_active", + metric.WithDescription("Active worker count"), + metric.WithUnit("{count}"), + )), + workersIdle: must(meter.Int64Gauge( + "evmrpc_workerpool_workers_idle", + metric.WithDescription("Idle worker count"), + metric.WithUnit("{count}"), + )), + queueCapacity: must(meter.Int64Gauge( + "evmrpc_workerpool_queue_capacity", + metric.WithDescription("Task queue capacity"), + metric.WithUnit("{count}"), + )), + queueDepth: must(meter.Int64Gauge( + "evmrpc_workerpool_queue_depth", + metric.WithDescription("Current task queue depth"), + metric.WithUnit("{count}"), + )), + queuePeak: must(meter.Int64Gauge( + "evmrpc_workerpool_queue_peak", + metric.WithDescription("Peak queue depth observed"), + metric.WithUnit("{count}"), + )), + queueUtilizationPct: must(meter.Float64Gauge( + "evmrpc_workerpool_queue_utilization_pct", + metric.WithDescription("Queue utilization percentage"), + metric.WithUnit("1"), + )), + tasksSubmittedTotal: must(meter.Int64Gauge( + "evmrpc_workerpool_tasks_submitted_total", + metric.WithDescription("Tasks submitted"), + metric.WithUnit("{count}"), + )), + tasksCompletedTotal: must(meter.Int64Gauge( + "evmrpc_workerpool_tasks_completed_total", + metric.WithDescription("Tasks completed"), + metric.WithUnit("{count}"), + )), + tasksRejectedTotal: must(meter.Int64Gauge( + "evmrpc_workerpool_tasks_rejected_total", + metric.WithDescription("Tasks rejected due to full queue"), + metric.WithUnit("{count}"), + )), + tasksPanickedTotal: must(meter.Int64Gauge( + "evmrpc_workerpool_tasks_panicked_total", + metric.WithDescription("Tasks that panicked"), + metric.WithUnit("{count}"), + )), + dbSemaphoreCapacity: must(meter.Int64Gauge( + "evmrpc_db_semaphore_capacity", + metric.WithDescription("DB semaphore capacity"), + metric.WithUnit("{count}"), + )), + dbSemaphoreInUse: must(meter.Int64Gauge( + "evmrpc_db_semaphore_inuse", + metric.WithDescription("DB semaphore currently acquired"), + metric.WithUnit("{count}"), + )), + dbSemaphoreAvailable: must(meter.Int64Gauge( + "evmrpc_db_semaphore_available", + metric.WithDescription("DB semaphore available slots"), + metric.WithUnit("{count}"), + )), + dbSemaphoreWaitCount: must(meter.Int64Gauge( + "evmrpc_db_semaphore_wait_count", + metric.WithDescription("DB semaphore wait count"), + metric.WithUnit("{count}"), + )), + subscriptionsActive: must(meter.Int64Gauge( + "evmrpc_subscriptions_active", + metric.WithDescription("Active subscriptions"), + metric.WithUnit("{count}"), + )), + getLogsRequestsTotal: must(meter.Int64Gauge( + "evmrpc_getlogs_requests_total", + metric.WithDescription("Total eth_getLogs requests"), + metric.WithUnit("{count}"), + )), + getLogsSuccessTotal: must(meter.Int64Gauge( + "evmrpc_getlogs_success_total", + metric.WithDescription("Successful eth_getLogs requests"), + metric.WithUnit("{count}"), + )), + getLogsErrorsTotal: must(meter.Int64Gauge( + "evmrpc_getlogs_errors_total", + metric.WithDescription("Errored eth_getLogs requests"), + metric.WithUnit("{count}"), + )), + getLogsTPS: must(meter.Float64Gauge( + "evmrpc_getlogs_tps", + metric.WithDescription("eth_getLogs throughput (req/s)"), + metric.WithUnit("1/s"), + )), + getLogsAvgBlockRange: must(meter.Float64Gauge( + "evmrpc_getlogs_avg_blockrange", + metric.WithDescription("Average block range for eth_getLogs"), + metric.WithUnit("{blocks}"), + )), + getLogsPeakBlockRange: must(meter.Int64Gauge( + "evmrpc_getlogs_peak_blockrange", + metric.WithDescription("Peak block range for eth_getLogs"), + metric.WithUnit("{blocks}"), + )), + getLogsAvgLatencyMs: must(meter.Float64Gauge( + "evmrpc_getlogs_avg_latency_ms", + metric.WithDescription("Average eth_getLogs latency (ms)"), + metric.WithUnit("ms"), + )), + getLogsMaxLatencyMs: must(meter.Float64Gauge( + "evmrpc_getlogs_max_latency_ms", + metric.WithDescription("Max eth_getLogs latency (ms)"), + metric.WithUnit("ms"), + )), + errRangeTooLarge: must(meter.Int64Gauge( + "evmrpc_getlogs_errors_range_too_large", + metric.WithDescription("Errors due to block range too large"), + metric.WithUnit("{count}"), + )), + errRateLimited: must(meter.Int64Gauge( + "evmrpc_getlogs_errors_rate_limited", + metric.WithDescription("Errors due to rate limiting"), + metric.WithUnit("{count}"), + )), + errBackpressure: must(meter.Int64Gauge( + "evmrpc_getlogs_errors_backpressure", + metric.WithDescription("Errors due to backpressure"), + metric.WithUnit("{count}"), + )), + avgQueueWaitMs: must(meter.Float64Gauge( + "evmrpc_workerpool_avg_queue_wait_ms", + metric.WithDescription("Average queue wait time (ms)"), + metric.WithUnit("ms"), + )), + avgExecTimeMs: must(meter.Float64Gauge( + "evmrpc_workerpool_avg_exec_time_ms", + metric.WithDescription("Average execution time (ms)"), + metric.WithUnit("ms"), + )), + avgDBWaitMs: must(meter.Float64Gauge( + "evmrpc_db_semaphore_avg_wait_ms", + metric.WithDescription("Average DB semaphore wait (ms)"), + metric.WithUnit("ms"), + )), + } +) + +// GetGlobalMetrics returns the metrics from the global worker pool +// This is a convenience function for accessing metrics without importing worker pool +func GetGlobalMetrics() *WorkerPoolMetrics { + return GetGlobalWorkerPool().Metrics +} + +// StartMetricsPrinter starts a background goroutine that prints metrics every interval +// This is idempotent - only the first call will start the printer +// Note: Printing to stdout is controlled by the EVM_DEBUG_METRICS environment variable +// Set EVM_DEBUG_METRICS=true to enable debug output +func StartMetricsPrinter(interval time.Duration) { + metricsPrinterOnce.Do(func() { + metricsStopChan = make(chan struct{}) + debugEnabled := IsDebugMetricsEnabled() + go func() { + ticker := time.NewTicker(interval) + defer func() { + ticker.Stop() + metricsStopChan = nil + }() + + for { + select { + case <-ticker.C: + m := GetGlobalMetrics() + // Export to Prometheus (gauges need periodic update) + m.ExportPrometheusMetrics() + // Print to stdout only if debug is enabled + if debugEnabled { + m.PrintMetrics() + } + case <-metricsStopChan: + return + } + } + + }() + }) +} + +// StopMetricsPrinter stops the metrics printer, idempotent. +func StopMetricsPrinter() { + metricsStopOnce.Do(func() { + if metricsStopChan != nil { + close(metricsStopChan) + } + }) +} + +// RecordTaskSubmitted records a task submission +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordTaskSubmitted() { + m.TasksSubmitted.Add(1) + depth := m.QueueDepth.Add(1) + // Update peak if needed + for { + peak := m.PeakQueueDepth.Load() + if depth <= peak || m.PeakQueueDepth.CompareAndSwap(peak, depth) { + break + } + } +} + +// RecordTaskStarted records when a task starts executing +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordTaskStarted(queuedAt time.Time) { + m.ActiveWorkers.Add(1) + m.QueueDepth.Add(-1) + waitTime := time.Since(queuedAt) + m.TotalWaitTimeNs.Add(waitTime.Nanoseconds()) +} + +// RecordTaskCompleted records a task completion +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordTaskCompleted(startedAt time.Time) { + m.ActiveWorkers.Add(-1) + m.TasksCompleted.Add(1) + execTime := time.Since(startedAt) + m.TotalExecTimeNs.Add(execTime.Nanoseconds()) +} + +// RecordTaskRejected records a task rejection (queue full) +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordTaskRejected() { + m.TasksRejected.Add(1) +} + +// RecordTaskPanicked records a task panic +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordTaskPanicked() { + m.TasksPanicked.Add(1) +} + +// RecordDBSemaphoreAcquire records acquiring the DB semaphore +func (m *WorkerPoolMetrics) RecordDBSemaphoreAcquire() { + m.DBSemaphoreAcquired.Add(1) +} + +// RecordDBSemaphoreRelease records releasing the DB semaphore +func (m *WorkerPoolMetrics) RecordDBSemaphoreRelease() { + m.DBSemaphoreAcquired.Add(-1) +} + +// RecordDBSemaphoreWait records time spent waiting for DB semaphore +// Note: Prometheus export is done in batch via ExportPrometheusMetrics() +func (m *WorkerPoolMetrics) RecordDBSemaphoreWait(waitTime time.Duration) { + m.DBSemaphoreWaitTimeNs.Add(waitTime.Nanoseconds()) + m.DBSemaphoreWaitCount.Add(1) +} + +// RecordGetLogsRequest records an eth_getLogs request with detailed error categorization +func (m *WorkerPoolMetrics) RecordGetLogsRequest(blockRange int64, latency time.Duration, startTime time.Time, err error) { + m.GetLogsRequests.Add(1) + m.windowRequests.Add(1) + m.GetLogsBlockRangeSum.Add(blockRange) + m.GetLogsLatencySumNs.Add(latency.Nanoseconds()) + + // Update max latency + latencyNs := latency.Nanoseconds() + for { + maxLat := m.GetLogsMaxLatencyNs.Load() + if latencyNs <= maxLat || m.GetLogsMaxLatencyNs.CompareAndSwap(maxLat, latencyNs) { + break + } + } + + // Update peak range + for { + peak := m.GetLogsPeakRange.Load() + if blockRange <= peak || m.GetLogsPeakRange.CompareAndSwap(peak, blockRange) { + break + } + } + + // Record block range distribution + m.recordBlockRangeBucket(blockRange) + + // Categorize errors and record success per bucket + if err != nil { + m.GetLogsErrors.Add(1) + m.categorizeError(err) + } else { + m.GetLogsSuccess.Add(1) + m.recordBlockRangeBucketSuccess(blockRange) + } + // Note: Prometheus export is done in batch via ExportPrometheusMetrics() +} + +// recordBlockRangeBucket records the block range into the appropriate bucket +func (m *WorkerPoolMetrics) recordBlockRangeBucket(blockRange int64) { + switch { + case blockRange <= 10: + m.RangeBucket1to10.Add(1) + case blockRange <= 100: + m.RangeBucket11to100.Add(1) + case blockRange <= 500: + m.RangeBucket101to500.Add(1) + case blockRange <= 1000: + m.RangeBucket501to1000.Add(1) + case blockRange <= 2000: + m.RangeBucket1001to2000.Add(1) + default: + m.RangeBucketOver2000.Add(1) + } +} + +// recordBlockRangeBucketSuccess records a successful request in the appropriate bucket +func (m *WorkerPoolMetrics) recordBlockRangeBucketSuccess(blockRange int64) { + switch { + case blockRange <= 10: + m.RangeBucket1to10Success.Add(1) + case blockRange <= 100: + m.RangeBucket11to100Success.Add(1) + case blockRange <= 500: + m.RangeBucket101to500Success.Add(1) + case blockRange <= 1000: + m.RangeBucket501to1000Success.Add(1) + case blockRange <= 2000: + m.RangeBucket1001to2000Success.Add(1) + default: + m.RangeBucketOver2000Success.Add(1) + } +} + +// categorizeError categorizes an error into specific types +func (m *WorkerPoolMetrics) categorizeError(err error) { + if err == nil { + return + } + errStr := err.Error() + + switch { + case contains(errStr, "block range too large"): + m.ErrRangeTooLarge.Add(1) + case contains(errStr, "timeout") || contains(errStr, "deadline exceeded") || contains(errStr, "request timed out"): + m.ErrTimeout.Add(1) + case contains(errStr, "rate limit"): + m.ErrRateLimited.Add(1) + case contains(errStr, "server too busy") || contains(errStr, "pending"): + m.ErrBackpressure.Add(1) + case contains(errStr, "I/O saturated") || contains(errStr, "semaphore"): + m.ErrIOSaturated.Add(1) + case contains(errStr, "block not found") || contains(errStr, "height is not available") || contains(errStr, "pruned blocks"): + m.ErrBlockNotFound.Add(1) + case contains(errStr, "queue is full") || contains(errStr, "system overloaded"): + m.ErrQueueFull.Add(1) + default: + m.ErrOther.Add(1) + } +} + +// contains is a helper function for case-insensitive substring matching +func contains(s, substr string) bool { + return len(s) >= len(substr) && (s == substr || + len(substr) == 0 || + (len(s) > 0 && len(substr) > 0 && containsLower(toLower(s), toLower(substr)))) +} + +func toLower(s string) string { + b := make([]byte, len(s)) + for i := 0; i < len(s); i++ { + c := s[i] + if c >= 'A' && c <= 'Z' { + c += 'a' - 'A' + } + b[i] = c + } + return string(b) +} + +func containsLower(s, substr string) bool { + for i := 0; i <= len(s)-len(substr); i++ { + if s[i:i+len(substr)] == substr { + return true + } + } + return false +} + +// RecordSubscriptionStart records a new subscription +func (m *WorkerPoolMetrics) RecordSubscriptionStart() { + m.ActiveSubscriptions.Add(1) +} + +// RecordSubscriptionEnd records subscription end +func (m *WorkerPoolMetrics) RecordSubscriptionEnd() { + m.ActiveSubscriptions.Add(-1) +} + +// RecordSubscriptionError records a subscription error +func (m *WorkerPoolMetrics) RecordSubscriptionError() { + m.SubscriptionErrors.Add(1) + // Export to Prometheus + telemetry.IncrCounter(1, "sei", "evm", "subscriptions", "errors") +} + +// GetTPS calculates the current TPS based on time window +func (m *WorkerPoolMetrics) GetTPS() float64 { + m.mu.RLock() + windowStart := m.windowStart + requests := m.windowRequests.Load() + m.mu.RUnlock() + + elapsed := time.Since(windowStart).Seconds() + if elapsed <= 0 { + return 0 + } + return float64(requests) / elapsed +} + +// ResetTPSWindow resets the TPS calculation window +func (m *WorkerPoolMetrics) ResetTPSWindow() { + m.mu.Lock() + m.windowStart = time.Now() + m.windowRequests.Store(0) + m.mu.Unlock() +} + +// GetAverageQueueWaitTime returns average time tasks spend waiting in queue +func (m *WorkerPoolMetrics) GetAverageQueueWaitTime() time.Duration { + completed := m.TasksCompleted.Load() + if completed == 0 { + return 0 + } + return time.Duration(m.TotalWaitTimeNs.Load() / completed) +} + +// GetAverageExecTime returns average task execution time +func (m *WorkerPoolMetrics) GetAverageExecTime() time.Duration { + completed := m.TasksCompleted.Load() + if completed == 0 { + return 0 + } + return time.Duration(m.TotalExecTimeNs.Load() / completed) +} + +// GetAverageDBWaitTime returns average DB semaphore wait time +func (m *WorkerPoolMetrics) GetAverageDBWaitTime() time.Duration { + count := m.DBSemaphoreWaitCount.Load() + if count == 0 { + return 0 + } + return time.Duration(m.DBSemaphoreWaitTimeNs.Load() / count) +} + +// GetAverageBlockRange returns average block range for eth_getLogs +func (m *WorkerPoolMetrics) GetAverageBlockRange() float64 { + requests := m.GetLogsRequests.Load() + if requests == 0 { + return 0 + } + return float64(m.GetLogsBlockRangeSum.Load()) / float64(requests) +} + +// GetAverageLatency returns average eth_getLogs latency +func (m *WorkerPoolMetrics) GetAverageLatency() time.Duration { + requests := m.GetLogsRequests.Load() + if requests == 0 { + return 0 + } + return time.Duration(m.GetLogsLatencySumNs.Load() / requests) +} + +// GetSnapshot returns a snapshot of current metrics +func (m *WorkerPoolMetrics) GetSnapshot() MetricsSnapshot { + totalWorkers := m.TotalWorkers.Load() + queueCap := m.QueueCapacity.Load() + dbSemCap := m.DBSemaphoreCapacity.Load() + + return MetricsSnapshot{ + Timestamp: time.Now(), + + // Worker pool + TotalWorkers: totalWorkers, + ActiveWorkers: m.ActiveWorkers.Load(), + IdleWorkers: totalWorkers - m.ActiveWorkers.Load(), + QueueCapacity: queueCap, + QueueDepth: m.QueueDepth.Load(), + QueueUtilization: float64(m.QueueDepth.Load()) / float64(max(queueCap, 1)) * 100, + PeakQueueDepth: m.PeakQueueDepth.Load(), + TasksSubmitted: m.TasksSubmitted.Load(), + TasksCompleted: m.TasksCompleted.Load(), + TasksRejected: m.TasksRejected.Load(), + TasksPending: m.TasksSubmitted.Load() - m.TasksCompleted.Load() - m.TasksRejected.Load(), + AvgQueueWaitTime: m.GetAverageQueueWaitTime(), + AvgExecTime: m.GetAverageExecTime(), + + // DB Semaphore + DBSemaphoreCapacity: dbSemCap, + DBSemaphoreInUse: m.DBSemaphoreAcquired.Load(), + DBSemaphoreAvail: dbSemCap - m.DBSemaphoreAcquired.Load(), + AvgDBWaitTime: m.GetAverageDBWaitTime(), + + // eth_getLogs + GetLogsTPS: m.GetTPS(), + GetLogsTotal: m.GetLogsRequests.Load(), + GetLogsSuccess: m.GetLogsSuccess.Load(), + GetLogsErrors: m.GetLogsErrors.Load(), + GetLogsErrorRate: float64(m.GetLogsErrors.Load()) / float64(max(m.GetLogsRequests.Load(), 1)) * 100, + AvgBlockRange: m.GetAverageBlockRange(), + PeakBlockRange: m.GetLogsPeakRange.Load(), + AvgLatency: m.GetAverageLatency(), + MaxLatency: time.Duration(m.GetLogsMaxLatencyNs.Load()), + + // Error type breakdown + ErrRangeTooLarge: m.ErrRangeTooLarge.Load(), + ErrTimeout: m.ErrTimeout.Load(), + ErrRateLimited: m.ErrRateLimited.Load(), + ErrBackpressure: m.ErrBackpressure.Load(), + ErrIOSaturated: m.ErrIOSaturated.Load(), + ErrBlockNotFound: m.ErrBlockNotFound.Load(), + ErrQueueFull: m.ErrQueueFull.Load(), + ErrOther: m.ErrOther.Load(), + + // Block range distribution + RangeBucket1to10: m.RangeBucket1to10.Load(), + RangeBucket1to10Success: m.RangeBucket1to10Success.Load(), + RangeBucket11to100: m.RangeBucket11to100.Load(), + RangeBucket11to100Success: m.RangeBucket11to100Success.Load(), + RangeBucket101to500: m.RangeBucket101to500.Load(), + RangeBucket101to500Success: m.RangeBucket101to500Success.Load(), + RangeBucket501to1000: m.RangeBucket501to1000.Load(), + RangeBucket501to1000Success: m.RangeBucket501to1000Success.Load(), + RangeBucket1001to2000: m.RangeBucket1001to2000.Load(), + RangeBucket1001to2000Success: m.RangeBucket1001to2000Success.Load(), + RangeBucketOver2000: m.RangeBucketOver2000.Load(), + RangeBucketOver2000Success: m.RangeBucketOver2000Success.Load(), + + // Subscriptions + ActiveSubscriptions: m.ActiveSubscriptions.Load(), + SubscriptionErrors: m.SubscriptionErrors.Load(), + } +} + +// MetricsSnapshot represents a point-in-time snapshot of metrics +type MetricsSnapshot struct { + Timestamp time.Time + + // Worker pool + TotalWorkers int32 + ActiveWorkers int32 + IdleWorkers int32 + QueueCapacity int32 + QueueDepth int32 + QueueUtilization float64 + PeakQueueDepth int32 + TasksSubmitted int64 + TasksCompleted int64 + TasksRejected int64 + TasksPending int64 + AvgQueueWaitTime time.Duration + AvgExecTime time.Duration + + // DB Semaphore + DBSemaphoreCapacity int32 + DBSemaphoreInUse int32 + DBSemaphoreAvail int32 + AvgDBWaitTime time.Duration + + // eth_getLogs + GetLogsTPS float64 + GetLogsTotal int64 + GetLogsSuccess int64 + GetLogsErrors int64 + GetLogsErrorRate float64 + AvgBlockRange float64 + PeakBlockRange int64 + AvgLatency time.Duration + MaxLatency time.Duration + + // Error type breakdown + ErrRangeTooLarge int64 + ErrTimeout int64 + ErrRateLimited int64 + ErrBackpressure int64 + ErrIOSaturated int64 + ErrBlockNotFound int64 + ErrQueueFull int64 + ErrOther int64 + + // Block range distribution (total and success for calculating success rate) + RangeBucket1to10 int64 + RangeBucket1to10Success int64 + RangeBucket11to100 int64 + RangeBucket11to100Success int64 + RangeBucket101to500 int64 + RangeBucket101to500Success int64 + RangeBucket501to1000 int64 + RangeBucket501to1000Success int64 + RangeBucket1001to2000 int64 + RangeBucket1001to2000Success int64 + RangeBucketOver2000 int64 + RangeBucketOver2000Success int64 + + // Subscriptions + ActiveSubscriptions int32 + SubscriptionErrors int64 +} + +// PrintMetrics prints current metrics to stdout +func (m *WorkerPoolMetrics) PrintMetrics() { + s := m.GetSnapshot() + + fmt.Println("\n" + "=" + repeatStr("=", 79)) + fmt.Printf(" EVM RPC METRICS SNAPSHOT - %s\n", s.Timestamp.Format("2006-01-02 15:04:05.000")) + fmt.Println("=" + repeatStr("=", 79)) + + // Worker Pool Section + fmt.Println("\n┌─ WORKER POOL " + repeatStr("─", 65)) + fmt.Printf("│ Workers: %d total | %d active | %d idle\n", + s.TotalWorkers, s.ActiveWorkers, s.IdleWorkers) + fmt.Printf("│ Queue: %d/%d (%.1f%% full) | Peak: %d\n", + s.QueueDepth, s.QueueCapacity, s.QueueUtilization, s.PeakQueueDepth) + fmt.Printf("│ Tasks: %d submitted | %d completed | %d rejected | %d pending\n", + s.TasksSubmitted, s.TasksCompleted, s.TasksRejected, s.TasksPending) + fmt.Printf("│ Timing: Avg queue wait: %v | Avg exec: %v\n", + s.AvgQueueWaitTime.Round(time.Microsecond), s.AvgExecTime.Round(time.Microsecond)) + + // DB Semaphore Section + fmt.Println("├─ DB SEMAPHORE " + repeatStr("─", 63)) + fmt.Printf("│ Capacity: %d total | %d in-use | %d available\n", + s.DBSemaphoreCapacity, s.DBSemaphoreInUse, s.DBSemaphoreAvail) + fmt.Printf("│ Wait Time: Avg: %v\n", s.AvgDBWaitTime.Round(time.Microsecond)) + + // eth_getLogs Section + fmt.Println("├─ eth_getLogs " + repeatStr("─", 64)) + fmt.Printf("│ Requests: %d total | %d success | %d errors (%.1f%% error rate)\n", + s.GetLogsTotal, s.GetLogsSuccess, s.GetLogsErrors, s.GetLogsErrorRate) + fmt.Printf("│ TPS: %.2f req/s\n", s.GetLogsTPS) + fmt.Printf("│ Block Range: Avg: %.1f | Peak: %d\n", + s.AvgBlockRange, s.PeakBlockRange) + fmt.Printf("│ Latency: Avg: %v | Max: %v\n", + s.AvgLatency.Round(time.Millisecond), s.MaxLatency.Round(time.Millisecond)) + + // Error Breakdown Section + if s.GetLogsErrors > 0 { + fmt.Println("├─ ERROR BREAKDOWN " + repeatStr("─", 60)) + fmt.Printf("│ Range Too Large: %d\n", s.ErrRangeTooLarge) + fmt.Printf("│ Timeout: %d\n", s.ErrTimeout) + fmt.Printf("│ Rate Limited: %d\n", s.ErrRateLimited) + fmt.Printf("│ Backpressure: %d\n", s.ErrBackpressure) + fmt.Printf("│ I/O Saturated: %d\n", s.ErrIOSaturated) + fmt.Printf("│ Block Not Found: %d\n", s.ErrBlockNotFound) + fmt.Printf("│ Queue Full: %d\n", s.ErrQueueFull) + fmt.Printf("│ Other: %d\n", s.ErrOther) + } + + // Block Range Distribution Section with success rate + totalRangeRequests := s.RangeBucket1to10 + s.RangeBucket11to100 + s.RangeBucket101to500 + + s.RangeBucket501to1000 + s.RangeBucket1001to2000 + s.RangeBucketOver2000 + if totalRangeRequests > 0 { + fmt.Println("├─ BLOCK RANGE DISTRIBUTION " + repeatStr("─", 51)) + fmt.Println("│ Range Total Dist%% Success Rate") + fmt.Println("│ " + repeatStr("─", 50)) + printRangeBucket("1-10 blocks", s.RangeBucket1to10, s.RangeBucket1to10Success, totalRangeRequests) + printRangeBucket("11-100 blocks", s.RangeBucket11to100, s.RangeBucket11to100Success, totalRangeRequests) + printRangeBucket("101-500 blocks", s.RangeBucket101to500, s.RangeBucket101to500Success, totalRangeRequests) + printRangeBucket("501-1000 blocks", s.RangeBucket501to1000, s.RangeBucket501to1000Success, totalRangeRequests) + printRangeBucket("1001-2000 blocks", s.RangeBucket1001to2000, s.RangeBucket1001to2000Success, totalRangeRequests) + printRangeBucket(">2000 blocks", s.RangeBucketOver2000, s.RangeBucketOver2000Success, totalRangeRequests) + } + + // Subscriptions Section + fmt.Println("├─ SUBSCRIPTIONS " + repeatStr("─", 62)) + fmt.Printf("│ Active: %d | Errors: %d\n", + s.ActiveSubscriptions, s.SubscriptionErrors) + + fmt.Println("└" + repeatStr("─", 79)) + + // Alert conditions + if s.QueueUtilization > 80 { + fmt.Printf("⚠️ WARNING: Queue utilization at %.1f%% - approaching saturation!\n", s.QueueUtilization) + } + if s.DBSemaphoreAvail == 0 { + fmt.Println("⚠️ WARNING: DB Semaphore exhausted - all slots in use!") + } + if s.ErrTimeout > 0 && float64(s.ErrTimeout)/float64(max(s.GetLogsTotal, 1)) > 0.1 { + fmt.Printf("⚠️ WARNING: High timeout rate (%.1f%%) - consider reducing max_blocks_for_log\n", + float64(s.ErrTimeout)/float64(s.GetLogsTotal)*100) + } + if s.RangeBucketOver2000 > 0 { + fmt.Printf("⚠️ WARNING: %d requests exceeded 2000 block limit\n", s.RangeBucketOver2000) + } +} + +// printRangeBucket prints a single range bucket with success rate +func printRangeBucket(name string, total, success, totalRequests int64) { + if total == 0 { + fmt.Printf("│ %-16s %6d %5.1f%% %6d %5.1f%%\n", + name, total, 0.0, success, 0.0) + } else { + successRate := float64(success) / float64(total) * 100 + distPct := float64(total) / float64(totalRequests) * 100 + fmt.Printf("│ %-16s %6d %5.1f%% %6d %5.1f%%\n", + name, total, distPct, success, successRate) + } +} + +func repeatStr(s string, count int) string { + result := "" + for i := 0; i < count; i++ { + result += s + } + return result +} + +func must[V any](v V, err error) V { + if err != nil { + panic(err) + } + return v +} + +// ResetMetrics resets all metrics (useful for testing) +func (m *WorkerPoolMetrics) ResetMetrics() { + m.ActiveWorkers.Store(0) + m.QueueDepth.Store(0) + m.PeakQueueDepth.Store(0) + m.TasksSubmitted.Store(0) + m.TasksCompleted.Store(0) + m.TasksRejected.Store(0) + m.TasksPanicked.Store(0) + m.TotalWaitTimeNs.Store(0) + m.TotalExecTimeNs.Store(0) + m.DBSemaphoreAcquired.Store(0) + m.DBSemaphoreWaitTimeNs.Store(0) + m.DBSemaphoreWaitCount.Store(0) + m.GetLogsRequests.Store(0) + m.GetLogsErrors.Store(0) + m.GetLogsSuccess.Store(0) + m.GetLogsBlockRangeSum.Store(0) + m.GetLogsLatencySumNs.Store(0) + m.GetLogsPeakRange.Store(0) + m.GetLogsMaxLatencyNs.Store(0) + // Reset error breakdown + m.ErrRangeTooLarge.Store(0) + m.ErrTimeout.Store(0) + m.ErrRateLimited.Store(0) + m.ErrBackpressure.Store(0) + m.ErrIOSaturated.Store(0) + m.ErrBlockNotFound.Store(0) + m.ErrQueueFull.Store(0) + m.ErrOther.Store(0) + // Reset block range buckets + m.RangeBucket1to10.Store(0) + m.RangeBucket11to100.Store(0) + m.RangeBucket101to500.Store(0) + m.RangeBucket501to1000.Store(0) + m.RangeBucket1001to2000.Store(0) + m.RangeBucketOver2000.Store(0) + // Reset block range success buckets + m.RangeBucket1to10Success.Store(0) + m.RangeBucket11to100Success.Store(0) + m.RangeBucket101to500Success.Store(0) + m.RangeBucket501to1000Success.Store(0) + m.RangeBucket1001to2000Success.Store(0) + m.RangeBucketOver2000Success.Store(0) + // Reset subscriptions + m.ActiveSubscriptions.Store(0) + m.SubscriptionErrors.Store(0) + m.ResetTPSWindow() +} + +// ======================================== +// Prometheus Metrics Export Functions +// ======================================== + +// ExportPrometheusMetrics exports all metrics to OTel +// This should be called periodically (e.g., every 5 seconds) +// All metrics are exported as gauges for efficiency (batch export instead of per-operation) +func (m *WorkerPoolMetrics) ExportPrometheusMetrics() { + ctx := context.Background() + + // Worker Pool Gauges + totalWorkers := m.TotalWorkers.Load() + queueCap := m.QueueCapacity.Load() + dbSemCap := m.DBSemaphoreCapacity.Load() + + otelMetrics.workersTotal.Record(ctx, int64(totalWorkers)) + otelMetrics.workersActive.Record(ctx, int64(m.ActiveWorkers.Load())) + otelMetrics.workersIdle.Record(ctx, int64(totalWorkers-m.ActiveWorkers.Load())) + otelMetrics.queueCapacity.Record(ctx, int64(queueCap)) + otelMetrics.queueDepth.Record(ctx, int64(m.QueueDepth.Load())) + otelMetrics.queuePeak.Record(ctx, int64(m.PeakQueueDepth.Load())) + + utilization := float64(0) + if queueCap > 0 { + utilization = float64(m.QueueDepth.Load()) / float64(queueCap) * 100 + } + otelMetrics.queueUtilizationPct.Record(ctx, utilization) + + // Task counters (exported as gauges for batch efficiency) + otelMetrics.tasksSubmittedTotal.Record(ctx, m.TasksSubmitted.Load()) + otelMetrics.tasksCompletedTotal.Record(ctx, m.TasksCompleted.Load()) + otelMetrics.tasksRejectedTotal.Record(ctx, m.TasksRejected.Load()) + otelMetrics.tasksPanickedTotal.Record(ctx, m.TasksPanicked.Load()) + + // DB Semaphore Gauges + otelMetrics.dbSemaphoreCapacity.Record(ctx, int64(dbSemCap)) + otelMetrics.dbSemaphoreInUse.Record(ctx, int64(m.DBSemaphoreAcquired.Load())) + otelMetrics.dbSemaphoreAvailable.Record(ctx, int64(dbSemCap-m.DBSemaphoreAcquired.Load())) + otelMetrics.dbSemaphoreWaitCount.Record(ctx, m.DBSemaphoreWaitCount.Load()) + + // Subscriptions Gauge + otelMetrics.subscriptionsActive.Record(ctx, int64(m.ActiveSubscriptions.Load())) + + // eth_getLogs specific gauges + otelMetrics.getLogsRequestsTotal.Record(ctx, m.GetLogsRequests.Load()) + otelMetrics.getLogsSuccessTotal.Record(ctx, m.GetLogsSuccess.Load()) + otelMetrics.getLogsErrorsTotal.Record(ctx, m.GetLogsErrors.Load()) + otelMetrics.getLogsTPS.Record(ctx, m.GetTPS()) + otelMetrics.getLogsAvgBlockRange.Record(ctx, m.GetAverageBlockRange()) + otelMetrics.getLogsPeakBlockRange.Record(ctx, m.GetLogsPeakRange.Load()) + otelMetrics.getLogsAvgLatencyMs.Record(ctx, float64(m.GetAverageLatency().Milliseconds())) + otelMetrics.getLogsMaxLatencyMs.Record(ctx, float64(m.GetLogsMaxLatencyNs.Load())/1e6) + + // Error breakdown + otelMetrics.errRangeTooLarge.Record(ctx, m.ErrRangeTooLarge.Load()) + otelMetrics.errRateLimited.Record(ctx, m.ErrRateLimited.Load()) + otelMetrics.errBackpressure.Record(ctx, m.ErrBackpressure.Load()) + + // Average timings + otelMetrics.avgQueueWaitMs.Record(ctx, float64(m.GetAverageQueueWaitTime().Milliseconds())) + otelMetrics.avgExecTimeMs.Record(ctx, float64(m.GetAverageExecTime().Milliseconds())) + otelMetrics.avgDBWaitMs.Record(ctx, float64(m.GetAverageDBWaitTime().Milliseconds())) +} diff --git a/evmrpc/worker_pool_test.go b/evmrpc/worker_pool_test.go index 543c23884b..a10519f5af 100644 --- a/evmrpc/worker_pool_test.go +++ b/evmrpc/worker_pool_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config" "github.com/stretchr/testify/require" ) @@ -259,12 +260,12 @@ func TestWorkerPoolPanicRecovery(t *testing.T) { } func TestWorkerPoolConstants(t *testing.T) { - require.Equal(t, 100, WorkerBatchSize) - require.Equal(t, 1000, DefaultWorkerQueueSize) - require.Equal(t, 64, MaxWorkerPoolSize) + require.Equal(t, 100, evmrpcconfig.WorkerBatchSize) + require.Equal(t, 1000, evmrpcconfig.DefaultWorkerQueueSize) + require.Equal(t, 64, evmrpcconfig.MaxWorkerPoolSize) // Verify total capacity calculation - totalCapacity := DefaultWorkerQueueSize * WorkerBatchSize + totalCapacity := evmrpcconfig.DefaultWorkerQueueSize * evmrpcconfig.WorkerBatchSize require.Equal(t, 100000, totalCapacity, "Total capacity should be 100,000 blocks") } @@ -344,14 +345,14 @@ func TestInitGlobalWorkerPool(t *testing.T) { workerPoolSize: 0, workerQueueSize: 0, expectedWorkers: -1, // Will be runtime.NumCPU() * 2, check > 0 - expectedQueueSize: DefaultWorkerQueueSize, + expectedQueueSize: evmrpcconfig.DefaultWorkerQueueSize, }, { name: "only worker size specified", workerPoolSize: 20, workerQueueSize: 0, expectedWorkers: 20, - expectedQueueSize: DefaultWorkerQueueSize, + expectedQueueSize: evmrpcconfig.DefaultWorkerQueueSize, }, { name: "only queue size specified", diff --git a/go.mod b/go.mod index 4e93e4adcc..05ef48c147 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/tendermint/tm-db v0.6.8-0.20220519162814-e24b96538a12 go.opentelemetry.io/otel v1.38.0 go.opentelemetry.io/otel/exporters/prometheus v0.60.0 + go.opentelemetry.io/otel/metric v1.38.0 go.opentelemetry.io/otel/sdk/metric v1.38.0 go.opentelemetry.io/otel/trace v1.38.0 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa @@ -315,7 +316,6 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.9.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/sdk v1.38.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect @@ -341,13 +341,13 @@ require ( replace ( github.com/CosmWasm/wasmd => ./sei-wasmd - github.com/CosmWasm/wasmvm => ./sei-wasmvm + github.com/CosmWasm/wasmvm => github.com/sei-protocol/sei-wasmvm v1.5.4-sei.0.0.2 github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.23.2 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/cosmos/cosmos-sdk => ./sei-cosmos github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.2.0 github.com/cosmos/ibc-go/v3 => ./sei-ibc-go - github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.15.7-sei-7.0.20250929182230-93350978bb7c + github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.15.7-sei-14 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/sei-protocol/sei-db => ./sei-db // Latest goleveldb is broken, we have to stick to this version diff --git a/go.sum b/go.sum index 7900530ead..2519ff10fb 100644 --- a/go.sum +++ b/go.sum @@ -1995,8 +1995,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/securego/gosec/v2 v2.11.0 h1:+PDkpzR41OI2jrw1q6AdXZCbsNGNGT7pQjal0H0cArI= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/go-ethereum v1.15.7-sei-7.0.20250929182230-93350978bb7c h1:p3Q8KgwlYEZW5Iyr/X6RJ63cezc+GG3tVQ3BCnfxEgo= -github.com/sei-protocol/go-ethereum v1.15.7-sei-7.0.20250929182230-93350978bb7c/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0= +github.com/sei-protocol/go-ethereum v1.15.7-sei-14 h1:yJ272fLard1CqL3YvDEB3MFpp9zJ37j3ky4ojqq7NL0= +github.com/sei-protocol/go-ethereum v1.15.7-sei-14/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= github.com/sei-protocol/sei-iavl v0.2.0 h1:OisPjXiDT+oe+aeckzDEFgkZCYuUjHgs/PP8DPicN+I= diff --git a/go.work b/go.work index 90acd29565..cf78e941d6 100644 --- a/go.work +++ b/go.work @@ -7,5 +7,5 @@ use ( ./sei-ibc-go ./sei-tendermint ./sei-wasmd - ./sei-wasmvm + // ./sei-wasmvm ) diff --git a/go.work.sum b/go.work.sum index 76e037ade8..020ec7e6a3 100644 --- a/go.work.sum +++ b/go.work.sum @@ -763,7 +763,6 @@ github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0 github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= @@ -771,9 +770,7 @@ github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= -github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/certificate-transparency-go v1.1.1 h1:6JHXZhXEvilMcTjR4MGZn5KV0IRkcFl4CJx5iHVhjFE= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-pkcs11 v0.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8= github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -1099,6 +1096,8 @@ github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= +github.com/sei-protocol/sei-wasmvm v1.5.4-sei.0.0.2 h1:bhfjHJFhYe/Ffq83UsSJrCcZPkAx5TSEJl1z5lBd6ow= +github.com/sei-protocol/sei-wasmvm v1.5.4-sei.0.0.2/go.mod h1:Q0bSEtlktzh7W2hhEaifrFp1Erx11ckQZmjq8FLCyys= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 h1:aSISeOcal5irEhJd1M+IrApc0PdcN7e7Aj4yuEnOrfQ= @@ -1165,7 +1164,6 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3Ifn github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= diff --git a/oracle/price-feeder/oracle/oracle.go b/oracle/price-feeder/oracle/oracle.go index e38eeec5cb..def4228007 100644 --- a/oracle/price-feeder/oracle/oracle.go +++ b/oracle/price-feeder/oracle/oracle.go @@ -330,7 +330,11 @@ func (o *Oracle) SetPrices(ctx context.Context) error { } } + o.mtx.Lock() o.prices = computedPrices + o.lastPriceSyncTS = time.Now() + o.mtx.Unlock() + return nil } @@ -650,7 +654,6 @@ func (o *Oracle) tick( if err = o.SetPrices(ctx); err != nil { return err } - o.lastPriceSyncTS = time.Now() // Get oracle vote period, next block height, current vote period, and index // in the vote period. diff --git a/oracle/price-feeder/oracle/oracle_test.go b/oracle/price-feeder/oracle/oracle_test.go index f54fe1dab7..4512bff2f3 100644 --- a/oracle/price-feeder/oracle/oracle_test.go +++ b/oracle/price-feeder/oracle/oracle_test.go @@ -1903,6 +1903,82 @@ func TestSafeMapContains(t *testing.T) { } } +// TestSetPricesAndGetPricesConcurrency tests that concurrent calls to SetPrices +// and GetPrices do not cause a data race. Run with `go test -race` to verify. +func TestSetPricesAndGetPricesConcurrency(t *testing.T) { + oracle := &Oracle{ + logger: zerolog.Nop(), + providerPairs: map[string][]types.CurrencyPair{ + config.ProviderBinance: {{Base: "ATOM", Quote: "USD"}}, + }, + chainDenomMapping: map[string]string{ + "ATOM": "uatom", + }, + priceProviders: map[string]provider.Provider{ + config.ProviderBinance: mockProvider{ + prices: map[string]provider.TickerPrice{ + "ATOMUSD": { + Price: sdk.MustNewDecFromStr("10.00"), + Volume: sdk.MustNewDecFromStr("1000000.00"), + }, + }, + }, + }, + failedProviders: make(map[string]error), + paramCache: ParamCache{ + params: &oracletypes.Params{ + Whitelist: denomList("uatom"), + }, + }, + providerTimeout: 100 * time.Millisecond, + deviations: make(map[string]sdk.Dec), + } + + ctx := context.Background() + var wg sync.WaitGroup + const numGoroutines = 10 + const numIterations = 50 + + // Start goroutines that call SetPrices + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < numIterations; j++ { + _ = oracle.SetPrices(ctx) + } + }() + } + + // Start goroutines that call GetPrices + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < numIterations; j++ { + _ = oracle.GetPrices() + } + }() + } + + // Start goroutines that call GetLastPriceSyncTimestamp + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < numIterations; j++ { + _ = oracle.GetLastPriceSyncTimestamp() + } + }() + } + + wg.Wait() + + // Verify the oracle is still in a valid state + prices := oracle.GetPrices() + require.NotNil(t, prices) +} + func TestReportPriceErrMetrics(t *testing.T) { tests := []struct { name string diff --git a/precompiles/addr/legacy/v620/abi.json b/precompiles/addr/legacy/v620/abi.json new file mode 100755 index 0000000000..f0425eaf83 --- /dev/null +++ b/precompiles/addr/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"v","type":"string"},{"internalType":"string","name":"r","type":"string"},{"internalType":"string","name":"s","type":"string"},{"internalType":"string","name":"customMessage","type":"string"}],"name":"associate","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"}],"name":"associatePubKey","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getSeiAddr","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"addr","type":"string"}],"name":"getEvmAddr","outputs":[{"internalType":"address","name":"response","type":"address"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/addr/legacy/v620/addr.go b/precompiles/addr/legacy/v620/addr.go new file mode 100644 index 0000000000..6342a132a6 --- /dev/null +++ b/precompiles/addr/legacy/v620/addr.go @@ -0,0 +1,276 @@ +package v620 + +import ( + "bytes" + "embed" + "encoding/hex" + "errors" + "fmt" + "strings" + + "github.com/btcsuite/btcd/btcec/v2" + + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/utils/helpers" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + GetSeiAddressMethod = "getSeiAddr" + GetEvmAddressMethod = "getEvmAddr" + Associate = "associate" + AssociatePubKey = "associatePubKey" +) + +const ( + AddrAddress = "0x0000000000000000000000000000000000001004" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + accountKeeper putils.AccountKeeper + + GetSeiAddressID []byte + GetEvmAddressID []byte + AssociateID []byte + AssociatePubKeyID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + accountKeeper: keepers.AccountK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetSeiAddressMethod: + p.GetSeiAddressID = m.ID + case GetEvmAddressMethod: + p.GetEvmAddressID = m.ID + case Associate: + p.AssociateID = m.ID + case AssociatePubKey: + p.AssociatePubKeyID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(AddrAddress), "addr"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + if bytes.Equal(method.ID, p.AssociateID) || bytes.Equal(method.ID, p.AssociatePubKeyID) { + return 50000 + } + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, _ common.Address, _ common.Address, args []interface{}, value *big.Int, readOnly bool, _ *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case GetSeiAddressMethod: + return p.getSeiAddr(ctx, method, args, value) + case GetEvmAddressMethod: + return p.getEvmAddr(ctx, method, args, value) + case Associate: + if readOnly { + return nil, 0, errors.New("cannot call associate precompile from staticcall") + } + return p.associate(ctx, method, args, value) + case AssociatePubKey: + if readOnly { + return nil, 0, errors.New("cannot call associate pub key precompile from staticcall") + } + return p.associatePublicKey(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) getSeiAddr(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, args[0].(common.Address)) + if !found { + metrics.IncrementAssociationError("getSeiAddr", types.NewAssociationMissingErr(args[0].(common.Address).Hex())) + return nil, 0, fmt.Errorf("EVM address %s is not associated", args[0].(common.Address).Hex()) + } + ret, err = method.Outputs.Pack(seiAddr.String()) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) getEvmAddr(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + seiAddr, err := sdk.AccAddressFromBech32(args[0].(string)) + if err != nil { + return nil, 0, err + } + + evmAddr, found := p.evmKeeper.GetEVMAddress(ctx, seiAddr) + if !found { + metrics.IncrementAssociationError("getEvmAddr", types.NewAssociationMissingErr(args[0].(string))) + return nil, 0, fmt.Errorf("sei address %s is not associated", args[0].(string)) + } + ret, err = method.Outputs.Pack(evmAddr) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) associate(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + + // v, r and s are components of a signature over the customMessage sent. + // We use the signature to construct the user's pubkey to obtain their addresses. + v := args[0].(string) + r := args[1].(string) + s := args[2].(string) + customMessage := args[3].(string) + + rBytes, err := decodeHexString(r) + if err != nil { + return nil, 0, err + } + sBytes, err := decodeHexString(s) + if err != nil { + return nil, 0, err + } + vBytes, err := decodeHexString(v) + if err != nil { + return nil, 0, err + } + + vBig := new(big.Int).SetBytes(vBytes) + rBig := new(big.Int).SetBytes(rBytes) + sBig := new(big.Int).SetBytes(sBytes) + + // Derive addresses + vBig = new(big.Int).Add(vBig, utils.Big27) + + customMessageHash := crypto.Keccak256Hash([]byte(customMessage)) + evmAddr, seiAddr, pubkey, err := helpers.GetAddresses(vBig, rBig, sBig, customMessageHash) + if err != nil { + return nil, 0, err + } + + return p.associateAddresses(ctx, method, evmAddr, seiAddr, pubkey) +} + +func (p PrecompileExecutor) associatePublicKey(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + // Takes a single argument, a compressed pubkey in hex format, excluding the '0x' + pubKeyHex := args[0].(string) + + pubKeyBytes, err := hex.DecodeString(pubKeyHex) + if err != nil { + return nil, 0, err + } + + // Parse the compressed public key + pubKey, err := btcec.ParsePubKey(pubKeyBytes) + if err != nil { + return nil, 0, err + } + + // Convert to uncompressed public key + uncompressedPubKey := pubKey.SerializeUncompressed() + + evmAddr, seiAddr, pubkey, err := helpers.GetAddressesFromPubkeyBytes(uncompressedPubKey) + if err != nil { + return nil, 0, err + } + + return p.associateAddresses(ctx, method, evmAddr, seiAddr, pubkey) +} + +func (p PrecompileExecutor) associateAddresses(ctx sdk.Context, method *abi.Method, evmAddr common.Address, seiAddr sdk.AccAddress, pubkey cryptotypes.PubKey) (ret []byte, remainingGas uint64, err error) { + // Check that address is not already associated + _, found := p.evmKeeper.GetEVMAddress(ctx, seiAddr) + if found { + return nil, 0, fmt.Errorf("address %s is already associated with evm address %s", seiAddr, evmAddr) + } + + // Associate Addresses: + associationHelper := helpers.NewAssociationHelper(p.evmKeeper, p.bankKeeper, p.accountKeeper) + err = associationHelper.AssociateAddresses(ctx, seiAddr, evmAddr, pubkey) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(seiAddr.String(), evmAddr) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (PrecompileExecutor) IsTransaction(method string) bool { + switch method { + case Associate: + return true + default: + return false + } +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +func decodeHexString(hexString string) ([]byte, error) { + trimmed := strings.TrimPrefix(hexString, "0x") + if len(trimmed)%2 != 0 { + trimmed = "0" + trimmed + } + return hex.DecodeString(trimmed) +} diff --git a/precompiles/addr/legacy/v630/abi.json b/precompiles/addr/legacy/v630/abi.json new file mode 100755 index 0000000000..f0425eaf83 --- /dev/null +++ b/precompiles/addr/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"v","type":"string"},{"internalType":"string","name":"r","type":"string"},{"internalType":"string","name":"s","type":"string"},{"internalType":"string","name":"customMessage","type":"string"}],"name":"associate","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"}],"name":"associatePubKey","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getSeiAddr","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"addr","type":"string"}],"name":"getEvmAddr","outputs":[{"internalType":"address","name":"response","type":"address"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/addr/legacy/v630/addr.go b/precompiles/addr/legacy/v630/addr.go new file mode 100644 index 0000000000..316c492099 --- /dev/null +++ b/precompiles/addr/legacy/v630/addr.go @@ -0,0 +1,276 @@ +package v630 + +import ( + "bytes" + "embed" + "encoding/hex" + "errors" + "fmt" + "strings" + + "github.com/btcsuite/btcd/btcec/v2" + + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/utils/helpers" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + GetSeiAddressMethod = "getSeiAddr" + GetEvmAddressMethod = "getEvmAddr" + Associate = "associate" + AssociatePubKey = "associatePubKey" +) + +const ( + AddrAddress = "0x0000000000000000000000000000000000001004" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + accountKeeper putils.AccountKeeper + + GetSeiAddressID []byte + GetEvmAddressID []byte + AssociateID []byte + AssociatePubKeyID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + accountKeeper: keepers.AccountK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetSeiAddressMethod: + p.GetSeiAddressID = m.ID + case GetEvmAddressMethod: + p.GetEvmAddressID = m.ID + case Associate: + p.AssociateID = m.ID + case AssociatePubKey: + p.AssociatePubKeyID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(AddrAddress), "addr"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + if bytes.Equal(method.ID, p.AssociateID) || bytes.Equal(method.ID, p.AssociatePubKeyID) { + return 50000 + } + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, _ common.Address, _ common.Address, args []interface{}, value *big.Int, readOnly bool, _ *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case GetSeiAddressMethod: + return p.getSeiAddr(ctx, method, args, value) + case GetEvmAddressMethod: + return p.getEvmAddr(ctx, method, args, value) + case Associate: + if readOnly { + return nil, 0, errors.New("cannot call associate precompile from staticcall") + } + return p.associate(ctx, method, args, value) + case AssociatePubKey: + if readOnly { + return nil, 0, errors.New("cannot call associate pub key precompile from staticcall") + } + return p.associatePublicKey(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) getSeiAddr(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, args[0].(common.Address)) + if !found { + metrics.IncrementAssociationError("getSeiAddr", types.NewAssociationMissingErr(args[0].(common.Address).Hex())) + return nil, 0, fmt.Errorf("EVM address %s is not associated", args[0].(common.Address).Hex()) + } + ret, err = method.Outputs.Pack(seiAddr.String()) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) getEvmAddr(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + seiAddr, err := sdk.AccAddressFromBech32(args[0].(string)) + if err != nil { + return nil, 0, err + } + + evmAddr, found := p.evmKeeper.GetEVMAddress(ctx, seiAddr) + if !found { + metrics.IncrementAssociationError("getEvmAddr", types.NewAssociationMissingErr(args[0].(string))) + return nil, 0, fmt.Errorf("sei address %s is not associated", args[0].(string)) + } + ret, err = method.Outputs.Pack(evmAddr) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) associate(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + + // v, r and s are components of a signature over the customMessage sent. + // We use the signature to construct the user's pubkey to obtain their addresses. + v := args[0].(string) + r := args[1].(string) + s := args[2].(string) + customMessage := args[3].(string) + + rBytes, err := decodeHexString(r) + if err != nil { + return nil, 0, err + } + sBytes, err := decodeHexString(s) + if err != nil { + return nil, 0, err + } + vBytes, err := decodeHexString(v) + if err != nil { + return nil, 0, err + } + + vBig := new(big.Int).SetBytes(vBytes) + rBig := new(big.Int).SetBytes(rBytes) + sBig := new(big.Int).SetBytes(sBytes) + + // Derive addresses + vBig = new(big.Int).Add(vBig, utils.Big27) + + customMessageHash := crypto.Keccak256Hash([]byte(customMessage)) + evmAddr, seiAddr, pubkey, err := helpers.GetAddresses(vBig, rBig, sBig, customMessageHash) + if err != nil { + return nil, 0, err + } + + return p.associateAddresses(ctx, method, evmAddr, seiAddr, pubkey) +} + +func (p PrecompileExecutor) associatePublicKey(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + // Takes a single argument, a compressed pubkey in hex format, excluding the '0x' + pubKeyHex := args[0].(string) + + pubKeyBytes, err := hex.DecodeString(pubKeyHex) + if err != nil { + return nil, 0, err + } + + // Parse the compressed public key + pubKey, err := btcec.ParsePubKey(pubKeyBytes) + if err != nil { + return nil, 0, err + } + + // Convert to uncompressed public key + uncompressedPubKey := pubKey.SerializeUncompressed() + + evmAddr, seiAddr, pubkey, err := helpers.GetAddressesFromPubkeyBytes(uncompressedPubKey) + if err != nil { + return nil, 0, err + } + + return p.associateAddresses(ctx, method, evmAddr, seiAddr, pubkey) +} + +func (p PrecompileExecutor) associateAddresses(ctx sdk.Context, method *abi.Method, evmAddr common.Address, seiAddr sdk.AccAddress, pubkey cryptotypes.PubKey) (ret []byte, remainingGas uint64, err error) { + // Check that address is not already associated + _, found := p.evmKeeper.GetEVMAddress(ctx, seiAddr) + if found { + return nil, 0, fmt.Errorf("address %s is already associated with evm address %s", seiAddr, evmAddr) + } + + // Associate Addresses: + associationHelper := helpers.NewAssociationHelper(p.evmKeeper, p.bankKeeper, p.accountKeeper) + err = associationHelper.AssociateAddresses(ctx, seiAddr, evmAddr, pubkey) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(seiAddr.String(), evmAddr) + return ret, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (PrecompileExecutor) IsTransaction(method string) bool { + switch method { + case Associate: + return true + default: + return false + } +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +func decodeHexString(hexString string) ([]byte, error) { + trimmed := strings.TrimPrefix(hexString, "0x") + if len(trimmed)%2 != 0 { + trimmed = "0" + trimmed + } + return hex.DecodeString(trimmed) +} diff --git a/precompiles/addr/setup.go b/precompiles/addr/setup.go index 0e36fca119..775a52f95d 100644 --- a/precompiles/addr/setup.go +++ b/precompiles/addr/setup.go @@ -12,6 +12,8 @@ import ( addrv605 "github.com/sei-protocol/sei-chain/precompiles/addr/legacy/v605" addrv606 "github.com/sei-protocol/sei-chain/precompiles/addr/legacy/v606" addrv610 "github.com/sei-protocol/sei-chain/precompiles/addr/legacy/v610" + addrv614 "github.com/sei-protocol/sei-chain/precompiles/addr/legacy/v614" + addrv620 "github.com/sei-protocol/sei-chain/precompiles/addr/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -28,6 +30,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(addrv605.NewPrecompile(keepers)), "v6.0.6": check(addrv606.NewPrecompile(keepers)), "v6.1.0": check(addrv610.NewPrecompile(keepers)), + "v6.1.4": check(addrv614.NewPrecompile(keepers)), + "v6.2.0": check(addrv620.NewPrecompile(keepers)), } } diff --git a/precompiles/addr/versions b/precompiles/addr/versions index 110c5432a6..0a75508649 100644 --- a/precompiles/addr/versions +++ b/precompiles/addr/versions @@ -9,3 +9,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/bank/legacy/v620/abi.json b/precompiles/bank/legacy/v620/abi.json new file mode 100644 index 0000000000..844ac48943 --- /dev/null +++ b/precompiles/bank/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"all_balances","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IBank.Coin[]","name":"response","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"string","name":"denom","type":"string"}],"name":"balance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"response","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"name","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"send","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toNativeAddress","type":"string"}],"name":"sendNative","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"supply","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"symbol","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/bank/legacy/v620/bank.go b/precompiles/bank/legacy/v620/bank.go new file mode 100644 index 0000000000..cf783c650e --- /dev/null +++ b/precompiles/bank/legacy/v620/bank.go @@ -0,0 +1,391 @@ +package v620 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/tendermint/tendermint/libs/log" +) + +const ( + SendMethod = "send" + SendNativeMethod = "sendNative" + BalanceMethod = "balance" + AllBalancesMethod = "all_balances" + NameMethod = "name" + SymbolMethod = "symbol" + DecimalsMethod = "decimals" + SupplyMethod = "supply" +) + +const ( + BankAddress = "0x0000000000000000000000000000000000001001" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + accountKeeper putils.AccountKeeper + bankKeeper putils.BankKeeper + bankMsgServer putils.BankMsgServer + evmKeeper putils.EVMKeeper + address common.Address + + SendID []byte + SendNativeID []byte + BalanceID []byte + AllBalancesID []byte + NameID []byte + SymbolID []byte + DecimalsID []byte + SupplyID []byte +} + +type CoinBalance struct { + Amount *big.Int + Denom string +} + +func GetABI() abi.ABI { + return pcommon.MustGetABI(f, "abi.json") +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := GetABI() + p := &PrecompileExecutor{ + bankKeeper: keepers.BankK(), + bankMsgServer: keepers.BankMS(), + evmKeeper: keepers.EVMK(), + accountKeeper: keepers.AccountK(), + address: common.HexToAddress(BankAddress), + } + + for name, m := range newAbi.Methods { + switch name { + case SendMethod: + p.SendID = m.ID + case SendNativeMethod: + p.SendNativeID = m.ID + case BalanceMethod: + p.BalanceID = m.ID + case AllBalancesMethod: + p.AllBalancesID = m.ID + case NameMethod: + p.NameID = m.ID + case SymbolMethod: + p.SymbolID = m.ID + case DecimalsMethod: + p.DecimalsID = m.ID + case SupplyMethod: + p.SupplyID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "bank"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case SendMethod: + return p.send(ctx, caller, method, args, value, readOnly) + case SendNativeMethod: + return p.sendNative(ctx, method, args, caller, callingContract, value, readOnly, hooks, evm) + case BalanceMethod: + return p.balance(ctx, method, args, value) + case AllBalancesMethod: + return p.all_balances(ctx, method, args, value) + case NameMethod: + return p.name(ctx, method, args, value) + case SymbolMethod: + return p.symbol(ctx, method, args, value) + case DecimalsMethod: + return p.decimals(ctx, method, args, value) + case SupplyMethod: + return p.totalSupply(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) send(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, value *big.Int, readOnly bool) ([]byte, uint64, error) { + if readOnly { + return nil, 0, errors.New("cannot call send from staticcall") + } + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + denom := args[2].(string) + if denom == "" { + return nil, 0, errors.New("invalid denom") + } + pointer, _, exists := p.evmKeeper.GetERC20NativePointer(ctx, denom) + if !exists || pointer.Cmp(caller) != 0 { + return nil, 0, fmt.Errorf("only pointer %s can send %s but got %s", pointer.Hex(), denom, caller.Hex()) + } + amount := args[3].(*big.Int) + if amount.Cmp(utils.Big0) == 0 { + // short circuit + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err + } + senderSeiAddr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + receiverSeiAddr, err := p.accAddressFromArg(ctx, args[1]) + if err != nil { + return nil, 0, err + } + + msg := &banktypes.MsgSend{ + FromAddress: senderSeiAddr.String(), + ToAddress: receiverSeiAddr.String(), + Amount: sdk.NewCoins(sdk.NewCoin(denom, sdk.NewIntFromBigInt(amount))), + } + + err = msg.ValidateBasic() + if err != nil { + return nil, 0, err + } + + if _, err = p.bankMsgServer.Send(sdk.WrapSDKContext(ctx), msg); err != nil { + return nil, 0, err + } + + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) sendNative(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address, callingContract common.Address, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { + if readOnly { + return nil, 0, errors.New("cannot call sendNative from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall sendNative") + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + if value == nil || value.Sign() == 0 { + return nil, 0, errors.New("set `value` field to non-zero to send") + } + + senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) + if !ok { + return nil, 0, errors.New("invalid addr") + } + + receiverAddr, ok := (args[0]).(string) + if !ok || receiverAddr == "" { + return nil, 0, errors.New("invalid addr") + } + + receiverSeiAddr, err := sdk.AccAddressFromBech32(receiverAddr) + if err != nil { + return nil, 0, err + } + + usei, wei, err := pcommon.HandlePaymentUseiWei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderSeiAddr, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, 0, err + } + + if err := p.bankKeeper.SendCoinsAndWei(ctx, senderSeiAddr, receiverSeiAddr, usei, wei); err != nil { + return nil, 0, err + } + accExists := p.accountKeeper.HasAccount(ctx, receiverSeiAddr) + if !accExists { + defer metrics.SafeTelemetryIncrCounter(1, "new", "account") + p.accountKeeper.SetAccount(ctx, p.accountKeeper.NewAccountWithAddress(ctx, receiverSeiAddr)) + } + + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + remainingGas := pcommon.GetRemainingGas(newCtx, p.evmKeeper) + if hooks.OnEnter != nil { + hooks.OnEnter(evm.GetDepth()+1, byte(vm.CALL), caller, p.evmKeeper.GetEVMAddressOrDefault(newCtx, receiverSeiAddr), []byte{}, remainingGas, value) + } + defer func() { + if hooks.OnExit != nil { + hooks.OnExit(evm.GetDepth()+1, []byte{}, 0, nil, false) + } + }() + } + + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) balance(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + addr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + denom := args[1].(string) + if denom == "" { + return nil, 0, errors.New("invalid denom") + } + + bz, err := method.Outputs.Pack(p.bankKeeper.GetBalance(ctx, addr, denom).Amount.BigInt()) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) all_balances(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + addr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + + coins := p.bankKeeper.GetAllBalances(ctx, addr) + + // convert to coin balance structs + coinBalances := make([]CoinBalance, 0, len(coins)) + + for _, coin := range coins { + coinBalances = append(coinBalances, CoinBalance{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + }) + } + + bz, err := method.Outputs.Pack(coinBalances) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) name(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + metadata, found := p.bankKeeper.GetDenomMetaData(ctx, denom) + if !found { + return nil, 0, fmt.Errorf("denom %s not found", denom) + } + bz, err := method.Outputs.Pack(metadata.Name) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) symbol(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + metadata, found := p.bankKeeper.GetDenomMetaData(ctx, denom) + if !found { + return nil, 0, fmt.Errorf("denom %s not found", denom) + } + bz, err := method.Outputs.Pack(metadata.Symbol) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) decimals(ctx sdk.Context, method *abi.Method, _ []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + // all native tokens are integer-based, returns decimals for microdenom (usei) + bz, err := method.Outputs.Pack(uint8(0)) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) totalSupply(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + coin := p.bankKeeper.GetSupply(ctx, denom) + bz, err := method.Outputs.Pack(coin.Amount.BigInt()) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, addr) + if !found { + // return the casted version instead + return sdk.AccAddress(addr[:]), nil + } + return seiAddr, nil +} + +func (PrecompileExecutor) IsTransaction(method string) bool { + switch method { + case SendMethod: + return true + case SendNativeMethod: + return true + default: + return false + } +} + +func (p PrecompileExecutor) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("precompile", "bank") +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} diff --git a/precompiles/bank/legacy/v630/abi.json b/precompiles/bank/legacy/v630/abi.json new file mode 100644 index 0000000000..844ac48943 --- /dev/null +++ b/precompiles/bank/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"all_balances","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IBank.Coin[]","name":"response","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"string","name":"denom","type":"string"}],"name":"balance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"response","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"name","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"send","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toNativeAddress","type":"string"}],"name":"sendNative","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"supply","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"symbol","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/bank/legacy/v630/bank.go b/precompiles/bank/legacy/v630/bank.go new file mode 100644 index 0000000000..817cbc9940 --- /dev/null +++ b/precompiles/bank/legacy/v630/bank.go @@ -0,0 +1,391 @@ +package v630 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/tendermint/tendermint/libs/log" +) + +const ( + SendMethod = "send" + SendNativeMethod = "sendNative" + BalanceMethod = "balance" + AllBalancesMethod = "all_balances" + NameMethod = "name" + SymbolMethod = "symbol" + DecimalsMethod = "decimals" + SupplyMethod = "supply" +) + +const ( + BankAddress = "0x0000000000000000000000000000000000001001" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + accountKeeper putils.AccountKeeper + bankKeeper putils.BankKeeper + bankMsgServer putils.BankMsgServer + evmKeeper putils.EVMKeeper + address common.Address + + SendID []byte + SendNativeID []byte + BalanceID []byte + AllBalancesID []byte + NameID []byte + SymbolID []byte + DecimalsID []byte + SupplyID []byte +} + +type CoinBalance struct { + Amount *big.Int + Denom string +} + +func GetABI() abi.ABI { + return pcommon.MustGetABI(f, "abi.json") +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := GetABI() + p := &PrecompileExecutor{ + bankKeeper: keepers.BankK(), + bankMsgServer: keepers.BankMS(), + evmKeeper: keepers.EVMK(), + accountKeeper: keepers.AccountK(), + address: common.HexToAddress(BankAddress), + } + + for name, m := range newAbi.Methods { + switch name { + case SendMethod: + p.SendID = m.ID + case SendNativeMethod: + p.SendNativeID = m.ID + case BalanceMethod: + p.BalanceID = m.ID + case AllBalancesMethod: + p.AllBalancesID = m.ID + case NameMethod: + p.NameID = m.ID + case SymbolMethod: + p.SymbolID = m.ID + case DecimalsMethod: + p.DecimalsID = m.ID + case SupplyMethod: + p.SupplyID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "bank"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case SendMethod: + return p.send(ctx, caller, method, args, value, readOnly) + case SendNativeMethod: + return p.sendNative(ctx, method, args, caller, callingContract, value, readOnly, hooks, evm) + case BalanceMethod: + return p.balance(ctx, method, args, value) + case AllBalancesMethod: + return p.all_balances(ctx, method, args, value) + case NameMethod: + return p.name(ctx, method, args, value) + case SymbolMethod: + return p.symbol(ctx, method, args, value) + case DecimalsMethod: + return p.decimals(ctx, method, args, value) + case SupplyMethod: + return p.totalSupply(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) send(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, value *big.Int, readOnly bool) ([]byte, uint64, error) { + if readOnly { + return nil, 0, errors.New("cannot call send from staticcall") + } + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + denom := args[2].(string) + if denom == "" { + return nil, 0, errors.New("invalid denom") + } + pointer, _, exists := p.evmKeeper.GetERC20NativePointer(ctx, denom) + if !exists || pointer.Cmp(caller) != 0 { + return nil, 0, fmt.Errorf("only pointer %s can send %s but got %s", pointer.Hex(), denom, caller.Hex()) + } + amount := args[3].(*big.Int) + if amount.Cmp(utils.Big0) == 0 { + // short circuit + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err + } + senderSeiAddr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + receiverSeiAddr, err := p.accAddressFromArg(ctx, args[1]) + if err != nil { + return nil, 0, err + } + + msg := &banktypes.MsgSend{ + FromAddress: senderSeiAddr.String(), + ToAddress: receiverSeiAddr.String(), + Amount: sdk.NewCoins(sdk.NewCoin(denom, sdk.NewIntFromBigInt(amount))), + } + + err = msg.ValidateBasic() + if err != nil { + return nil, 0, err + } + + if _, err = p.bankMsgServer.Send(sdk.WrapSDKContext(ctx), msg); err != nil { + return nil, 0, err + } + + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) sendNative(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address, callingContract common.Address, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { + if readOnly { + return nil, 0, errors.New("cannot call sendNative from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall sendNative") + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + if value == nil || value.Sign() == 0 { + return nil, 0, errors.New("set `value` field to non-zero to send") + } + + senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) + if !ok { + return nil, 0, errors.New("invalid addr") + } + + receiverAddr, ok := (args[0]).(string) + if !ok || receiverAddr == "" { + return nil, 0, errors.New("invalid addr") + } + + receiverSeiAddr, err := sdk.AccAddressFromBech32(receiverAddr) + if err != nil { + return nil, 0, err + } + + usei, wei, err := pcommon.HandlePaymentUseiWei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderSeiAddr, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, 0, err + } + + if err := p.bankKeeper.SendCoinsAndWei(ctx, senderSeiAddr, receiverSeiAddr, usei, wei); err != nil { + return nil, 0, err + } + accExists := p.accountKeeper.HasAccount(ctx, receiverSeiAddr) + if !accExists { + defer metrics.SafeTelemetryIncrCounter(1, "new", "account") + p.accountKeeper.SetAccount(ctx, p.accountKeeper.NewAccountWithAddress(ctx, receiverSeiAddr)) + } + + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + remainingGas := pcommon.GetRemainingGas(newCtx, p.evmKeeper) + if hooks.OnEnter != nil { + hooks.OnEnter(evm.GetDepth()+1, byte(vm.CALL), caller, p.evmKeeper.GetEVMAddressOrDefault(newCtx, receiverSeiAddr), []byte{}, remainingGas, value) + } + defer func() { + if hooks.OnExit != nil { + hooks.OnExit(evm.GetDepth()+1, []byte{}, 0, nil, false) + } + }() + } + + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) balance(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + addr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + denom := args[1].(string) + if denom == "" { + return nil, 0, errors.New("invalid denom") + } + + bz, err := method.Outputs.Pack(p.bankKeeper.GetBalance(ctx, addr, denom).Amount.BigInt()) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) all_balances(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + addr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + return nil, 0, err + } + + coins := p.bankKeeper.GetAllBalances(ctx, addr) + + // convert to coin balance structs + coinBalances := make([]CoinBalance, 0, len(coins)) + + for _, coin := range coins { + coinBalances = append(coinBalances, CoinBalance{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + }) + } + + bz, err := method.Outputs.Pack(coinBalances) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) name(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + metadata, found := p.bankKeeper.GetDenomMetaData(ctx, denom) + if !found { + return nil, 0, fmt.Errorf("denom %s not found", denom) + } + bz, err := method.Outputs.Pack(metadata.Name) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) symbol(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + metadata, found := p.bankKeeper.GetDenomMetaData(ctx, denom) + if !found { + return nil, 0, fmt.Errorf("denom %s not found", denom) + } + bz, err := method.Outputs.Pack(metadata.Symbol) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) decimals(ctx sdk.Context, method *abi.Method, _ []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + // all native tokens are integer-based, returns decimals for microdenom (usei) + bz, err := method.Outputs.Pack(uint8(0)) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) totalSupply(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + denom := args[0].(string) + coin := p.bankKeeper.GetSupply(ctx, denom) + bz, err := method.Outputs.Pack(coin.Amount.BigInt()) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, addr) + if !found { + // return the casted version instead + return sdk.AccAddress(addr[:]), nil + } + return seiAddr, nil +} + +func (PrecompileExecutor) IsTransaction(method string) bool { + switch method { + case SendMethod: + return true + case SendNativeMethod: + return true + default: + return false + } +} + +func (p PrecompileExecutor) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("precompile", "bank") +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} diff --git a/precompiles/bank/setup.go b/precompiles/bank/setup.go index 7ad29b6263..9ed9057392 100644 --- a/precompiles/bank/setup.go +++ b/precompiles/bank/setup.go @@ -12,6 +12,8 @@ import ( bankv605 "github.com/sei-protocol/sei-chain/precompiles/bank/legacy/v605" bankv606 "github.com/sei-protocol/sei-chain/precompiles/bank/legacy/v606" bankv610 "github.com/sei-protocol/sei-chain/precompiles/bank/legacy/v610" + bankv614 "github.com/sei-protocol/sei-chain/precompiles/bank/legacy/v614" + bankv620 "github.com/sei-protocol/sei-chain/precompiles/bank/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -28,6 +30,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(bankv605.NewPrecompile(keepers)), "v6.0.6": check(bankv606.NewPrecompile(keepers)), "v6.1.0": check(bankv610.NewPrecompile(keepers)), + "v6.1.4": check(bankv614.NewPrecompile(keepers)), + "v6.2.0": check(bankv620.NewPrecompile(keepers)), } } diff --git a/precompiles/bank/versions b/precompiles/bank/versions index 90f0e38e72..0540db25ab 100644 --- a/precompiles/bank/versions +++ b/precompiles/bank/versions @@ -9,3 +9,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/common/legacy/v620/precompiles.go b/precompiles/common/legacy/v620/precompiles.go new file mode 100644 index 0000000000..854727ce13 --- /dev/null +++ b/precompiles/common/legacy/v620/precompiles.go @@ -0,0 +1,301 @@ +package v620 + +import ( + "bytes" + "embed" + "errors" + "fmt" + "math/big" + + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const UnknownMethodCallGas uint64 = 3000 + +type Contexter interface { + Ctx() sdk.Context +} + +type StateEVMKeeperGetter interface { + EVMKeeper() state.EVMKeeper +} + +type PrecompileExecutor interface { + RequiredGas([]byte, *abi.Method) uint64 + Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) ([]byte, error) +} + +type Precompile struct { + abi.ABI + address common.Address + name string + executor PrecompileExecutor +} + +var _ vm.PrecompiledContract = &Precompile{} + +func NewPrecompile(a abi.ABI, executor PrecompileExecutor, address common.Address, name string) *Precompile { + return &Precompile{ABI: a, executor: executor, address: address, name: name} +} + +func (p Precompile) RequiredGas(input []byte) uint64 { + methodID, err := ExtractMethodID(input) + if err != nil { + return UnknownMethodCallGas + } + + method, err := p.MethodById(methodID) + if err != nil { + // This should never happen since this method is going to fail during Run + return UnknownMethodCallGas + } + return p.executor.RequiredGas(input[4:], method) +} + +func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool, isFromDelegateCall bool, hooks *tracing.Hooks) (bz []byte, err error) { + operation := fmt.Sprintf("%s_unknown", p.name) + defer func() { + HandlePrecompileError(err, evm, operation) + if err != nil { + bz = []byte(err.Error()) + err = vm.ErrExecutionReverted + } + }() + ctx, method, args, err := p.Prepare(evm, input) + if err != nil { + return nil, err + } + + operation = method.Name + em := ctx.EventManager() + ctx = ctx.WithEventManager(sdk.NewEventManager()) + ctx = ctx.WithEVMPrecompileCalledFromDelegateCall(isFromDelegateCall) + bz, err = p.executor.Execute(ctx, method, caller, callingContract, args, value, readOnly, evm, hooks) + if err != nil { + return bz, err + } + events := ctx.EventManager().Events() + if len(events) > 0 { + em.EmitEvents(ctx.EventManager().Events()) + } + return bz, err +} + +func HandlePrecompileError(err error, evm *vm.EVM, operation string) { + if err != nil { + if sdb := state.GetDBImpl(evm.StateDB); sdb != nil { + sdb.SetPrecompileError(err) + } + metrics.IncrementErrorMetrics(operation, err) + } +} + +func (p Precompile) Prepare(evm *vm.EVM, input []byte) (sdk.Context, *abi.Method, []interface{}, error) { + ctxer := state.GetDBImpl(evm.StateDB) + if ctxer == nil { + return sdk.Context{}, nil, nil, errors.New("cannot get context from EVM") + } + methodID, err := ExtractMethodID(input) + if err != nil { + return sdk.Context{}, nil, nil, err + } + method, err := p.MethodById(methodID) + if err != nil { + return sdk.Context{}, nil, nil, err + } + + argsBz := input[4:] + args, err := method.Inputs.Unpack(argsBz) + if err != nil { + return sdk.Context{}, nil, nil, err + } + + return ctxer.Ctx(), method, args, nil +} + +func (p Precompile) GetABI() abi.ABI { + return p.ABI +} + +func (p Precompile) Address() common.Address { + return p.address +} + +func (p Precompile) GetName() string { + return p.name +} + +func (p Precompile) GetExecutor() PrecompileExecutor { + return p.executor +} + +type DynamicGasPrecompileExecutor interface { + Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) + EVMKeeper() putils.EVMKeeper +} + +type DynamicGasPrecompile struct { + *Precompile + executor DynamicGasPrecompileExecutor +} + +var _ vm.DynamicGasPrecompiledContract = &DynamicGasPrecompile{} + +func NewDynamicGasPrecompile(a abi.ABI, executor DynamicGasPrecompileExecutor, address common.Address, name string) *DynamicGasPrecompile { + return &DynamicGasPrecompile{Precompile: NewPrecompile(a, nil, address, name), executor: executor} +} + +func (d DynamicGasPrecompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, hooks *tracing.Hooks, readOnly bool, isFromDelegateCall bool) (ret []byte, remainingGas uint64, err error) { + operation := fmt.Sprintf("%s_unknown", d.name) + defer func() { + HandlePrecompileError(err, evm, operation) + if err != nil { + ret = []byte(err.Error()) + err = vm.ErrExecutionReverted + } + }() + ctx, method, args, err := d.Prepare(evm, input) + if err != nil { + return nil, 0, err + } + gasLimit := d.executor.EVMKeeper().GetCosmosGasLimitFromEVMGas(ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)), suppliedGas) + ctx = ctx.WithGasMeter(sdk.NewGasMeterWithMultiplier(ctx, gasLimit)) + operation = method.Name + em := ctx.EventManager() + ctx = ctx.WithEventManager(sdk.NewEventManager()) + ctx = ctx.WithEVMPrecompileCalledFromDelegateCall(isFromDelegateCall) + ret, remainingGas, err = d.executor.Execute(ctx, method, caller, callingContract, args, value, readOnly, evm, suppliedGas, hooks) + if err != nil { + return ret, remainingGas, err + } + events := ctx.EventManager().Events() + if len(events) > 0 { + em.EmitEvents(ctx.EventManager().Events()) + } + return ret, remainingGas, err +} + +func (d DynamicGasPrecompile) GetExecutor() DynamicGasPrecompileExecutor { + return d.executor +} + +func ValidateArgsLength(args []interface{}, length int) error { + if len(args) != length { + return fmt.Errorf("expected %d arguments but got %d", length, len(args)) + } + + return nil +} + +func ValidateNonPayable(value *big.Int) error { + if value != nil && value.Sign() != 0 { + return errors.New("sending funds to a non-payable function") + } + + return nil +} + +func HandlePaymentUsei(ctx sdk.Context, precompileAddr sdk.AccAddress, payer sdk.AccAddress, value *big.Int, bankKeeper putils.BankKeeper, evmKeeper putils.EVMKeeper, hooks *tracing.Hooks, depth int) (sdk.Coin, error) { + usei, wei := state.SplitUseiWeiAmount(value) + if !wei.IsZero() { + return sdk.Coin{}, fmt.Errorf("selected precompile function does not allow payment with non-zero wei remainder: received %s", value) + } + coin := sdk.NewCoin(sdk.MustGetBaseDenom(), usei) + // refund payer because the following precompile logic will debit the payments from payer's account + // this creates a new event manager to avoid surfacing these as cosmos events + if err := bankKeeper.SendCoins(ctx.WithEventManager(sdk.NewEventManager()), precompileAddr, payer, sdk.NewCoins(coin)); err != nil { + return sdk.Coin{}, err + } + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + if hooks.OnEnter != nil { + hooks.OnEnter(depth+1, byte(vm.CALL), evmKeeper.GetEVMAddressOrDefault(newCtx, precompileAddr), evmKeeper.GetEVMAddressOrDefault(newCtx, payer), []byte{}, GetRemainingGas(newCtx, evmKeeper), value) + } + if hooks.OnExit != nil { + hooks.OnExit(depth+1, []byte{}, 0, nil, false) + } + } + return coin, nil +} + +func HandlePaymentUseiWei(ctx sdk.Context, precompileAddr sdk.AccAddress, payer sdk.AccAddress, value *big.Int, bankKeeper putils.BankKeeper, evmKeeper putils.EVMKeeper, hooks *tracing.Hooks, depth int) (sdk.Int, sdk.Int, error) { + usei, wei := state.SplitUseiWeiAmount(value) + // refund payer because the following precompile logic will debit the payments from payer's account + // this creates a new event manager to avoid surfacing these as cosmos events + if err := bankKeeper.SendCoinsAndWei(ctx.WithEventManager(sdk.NewEventManager()), precompileAddr, payer, usei, wei); err != nil { + return sdk.Int{}, sdk.Int{}, err + } + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + if hooks.OnEnter != nil { + hooks.OnEnter(depth+1, byte(vm.CALL), evmKeeper.GetEVMAddressOrDefault(newCtx, precompileAddr), evmKeeper.GetEVMAddressOrDefault(newCtx, payer), []byte{}, GetRemainingGas(newCtx, evmKeeper), value) + } + if hooks.OnExit != nil { + hooks.OnExit(depth+1, []byte{}, 0, nil, false) + } + } + return usei, wei, nil +} + +/* +* +sei gas = evm gas * multiplier +sei gas price = fee / sei gas = fee / (evm gas * multiplier) = evm gas / multiplier +*/ +func GetRemainingGas(ctx sdk.Context, evmKeeper putils.EVMKeeper) uint64 { + return evmKeeper.GetEVMGasLimitFromCtx(ctx) +} + +func ExtractMethodID(input []byte) ([]byte, error) { + // Check if the input has at least the length needed for methodID + if len(input) < 4 { + return nil, errors.New("input too short to extract method ID") + } + return input[:4], nil +} + +func DefaultGasCost(input []byte, isTransaction bool) uint64 { + if isTransaction { + return storetypes.KVGasConfig().WriteCostFlat + (storetypes.KVGasConfig().WriteCostPerByte * uint64(len(input))) + } + + return storetypes.KVGasConfig().ReadCostFlat + (storetypes.KVGasConfig().ReadCostPerByte * uint64(len(input))) +} + +func MustGetABI(f embed.FS, filename string) abi.ABI { + abiBz, err := f.ReadFile(filename) + if err != nil { + panic(err) + } + + newAbi, err := abi.JSON(bytes.NewReader(abiBz)) + if err != nil { + panic(err) + } + return newAbi +} + +func GetSeiAddressByEvmAddress(ctx sdk.Context, evmAddress common.Address, evmKeeper putils.EVMKeeper) (sdk.AccAddress, error) { + seiAddr, associated := evmKeeper.GetSeiAddress(ctx, evmAddress) + if !associated { + return nil, types.NewAssociationMissingErr(evmAddress.Hex()) + } + return seiAddr, nil +} + +func GetSeiAddressFromArg(ctx sdk.Context, arg interface{}, evmKeeper putils.EVMKeeper) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + return GetSeiAddressByEvmAddress(ctx, addr, evmKeeper) +} diff --git a/precompiles/common/legacy/v630/evm_events.go b/precompiles/common/legacy/v630/evm_events.go new file mode 100644 index 0000000000..b771dc60c9 --- /dev/null +++ b/precompiles/common/legacy/v630/evm_events.go @@ -0,0 +1,242 @@ +package v630 + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/sei-protocol/sei-chain/x/evm/state" +) + +// EmitEVMLog emits an EVM log from a precompile +func EmitEVMLog(evm *vm.EVM, address common.Address, topics []common.Hash, data []byte) error { + if len(topics) > 4 { + return errors.New("log topics cannot be more than 4") + } + if evm == nil { + return fmt.Errorf("EVM is nil") + } + if evm.StateDB == nil { + return fmt.Errorf("EVM StateDB is nil") + } + + stateDB := state.GetDBImpl(evm.StateDB) + if stateDB == nil { + return fmt.Errorf("cannot emit log: invalid StateDB type") + } + + stateDB.AddLog(ðtypes.Log{ + Address: address, + Topics: topics, + Data: data, + // BlockNumber, BlockHash, TxHash, TxIndex, and Index are added later + // by the consensus engine when the block is being finalized. + }) + return nil +} + +// Event signatures for staking precompile +var ( + // Delegate(address indexed delegator, string validator, uint256 amount) + DelegateEventSig = crypto.Keccak256Hash([]byte("Delegate(address,string,uint256)")) + + // Redelegate(address indexed delegator, string srcValidator, string dstValidator, uint256 amount) + RedelegateEventSig = crypto.Keccak256Hash([]byte("Redelegate(address,string,string,uint256)")) + + // Undelegate(address indexed delegator, string validator, uint256 amount) + UndelegateEventSig = crypto.Keccak256Hash([]byte("Undelegate(address,string,uint256)")) + + // ValidatorCreated(address indexed validator, string validatorAddress, string moniker) + ValidatorCreatedEventSig = crypto.Keccak256Hash([]byte("ValidatorCreated(address,string,string)")) + + // ValidatorEdited(address indexed validator, string validatorAddress, string moniker) + ValidatorEditedEventSig = crypto.Keccak256Hash([]byte("ValidatorEdited(address,string,string)")) +) + +// Helper functions for common event patterns +func BuildDelegateEvent(delegator common.Address, validator string, amount *big.Int) ([]common.Hash, []byte, error) { + // Pack the non-indexed data: validator string and amount + // For strings in events, we need to encode: offset, length, and actual string data + data := make([]byte, 0) + + // Offset for string (always 64 for first dynamic param when second param is uint256) + data = append(data, common.LeftPadBytes(big.NewInt(64).Bytes(), 32)...) + + // Amount (uint256) + data = append(data, common.LeftPadBytes(amount.Bytes(), 32)...) + + // String length + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(validator))).Bytes(), 32)...) + + // String data (padded to 32 bytes) + valBytes := []byte(validator) + data = append(data, common.RightPadBytes(valBytes, ((len(valBytes)+31)/32)*32)...) + + topics := []common.Hash{ + DelegateEventSig, + common.BytesToHash(delegator.Bytes()), // indexed + } + return topics, data, nil +} + +func EmitDelegateEvent(evm *vm.EVM, precompileAddr common.Address, delegator common.Address, validator string, amount *big.Int) error { + topics, data, err := BuildDelegateEvent(delegator, validator, amount) + if err != nil { + return err + } + return EmitEVMLog(evm, precompileAddr, topics, data) +} + +func BuildRedelegateEvent(delegator common.Address, srcValidator, dstValidator string, amount *big.Int) ([]common.Hash, []byte, error) { + // Pack the non-indexed data: srcValidator, dstValidator, amount + var data []byte + // offset for srcValidator. Static part is 3 * 32 = 96 bytes. + data = append(data, common.LeftPadBytes(big.NewInt(96).Bytes(), 32)...) + // placeholder offset for dstValidator, to be updated after we know the length of srcValidator + data = append(data, common.LeftPadBytes(big.NewInt(0).Bytes(), 32)...) + // amount + data = append(data, common.LeftPadBytes(amount.Bytes(), 32)...) + + // srcValidator data part + srcBytes := []byte(srcValidator) + // length of srcValidator + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(srcBytes))).Bytes(), 32)...) + // data of srcValidator + paddedSrcBytes := common.RightPadBytes(srcBytes, ((len(srcBytes)+31)/32)*32) + data = append(data, paddedSrcBytes...) + + // now calculate and update dstValidator offset + dstOffset := 96 + 32 + len(paddedSrcBytes) + copy(data[32:64], common.LeftPadBytes(big.NewInt(int64(dstOffset)).Bytes(), 32)) + + // dstValidator data part + dstBytes := []byte(dstValidator) + // length of dstValidator + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(dstBytes))).Bytes(), 32)...) + // data of dstValidator + data = append(data, common.RightPadBytes(dstBytes, ((len(dstBytes)+31)/32)*32)...) + + topics := []common.Hash{ + RedelegateEventSig, + common.BytesToHash(delegator.Bytes()), // indexed + } + return topics, data, nil +} + +func EmitRedelegateEvent(evm *vm.EVM, precompileAddr common.Address, delegator common.Address, srcValidator, dstValidator string, amount *big.Int) error { + topics, data, err := BuildRedelegateEvent(delegator, srcValidator, dstValidator, amount) + if err != nil { + return err + } + return EmitEVMLog(evm, precompileAddr, topics, data) +} + +func BuildUndelegateEvent(delegator common.Address, validator string, amount *big.Int) ([]common.Hash, []byte, error) { + // Pack the non-indexed data: validator string and amount + data := make([]byte, 0) + + // Offset for string + data = append(data, common.LeftPadBytes(big.NewInt(64).Bytes(), 32)...) + + // Amount + data = append(data, common.LeftPadBytes(amount.Bytes(), 32)...) + + // String length and data + valBytes := []byte(validator) + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(valBytes))).Bytes(), 32)...) + data = append(data, common.RightPadBytes(valBytes, ((len(valBytes)+31)/32)*32)...) + + topics := []common.Hash{ + UndelegateEventSig, + common.BytesToHash(delegator.Bytes()), // indexed + } + return topics, data, nil +} + +func EmitUndelegateEvent(evm *vm.EVM, precompileAddr common.Address, delegator common.Address, validator string, amount *big.Int) error { + topics, data, err := BuildUndelegateEvent(delegator, validator, amount) + if err != nil { + return err + } + return EmitEVMLog(evm, precompileAddr, topics, data) +} + +func BuildValidatorCreatedEvent(creator common.Address, validatorAddr string, moniker string) ([]common.Hash, []byte, error) { + // Pack the non-indexed data: validatorAddr string and moniker string + data := make([]byte, 0) + + // Offsets for two strings + data = append(data, common.LeftPadBytes(big.NewInt(64).Bytes(), 32)...) // offset for validatorAddr + data = append(data, common.LeftPadBytes(big.NewInt(128).Bytes(), 32)...) // offset for moniker (approximate) + + // validatorAddr string + valAddrBytes := []byte(validatorAddr) + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(valAddrBytes))).Bytes(), 32)...) + data = append(data, common.RightPadBytes(valAddrBytes, ((len(valAddrBytes)+31)/32)*32)...) + + // Adjust offset for moniker based on actual validatorAddr length + monikerOffset := 64 + 32 + ((len(valAddrBytes)+31)/32)*32 + // Update the moniker offset in data + copy(data[32:64], common.LeftPadBytes(big.NewInt(int64(monikerOffset)).Bytes(), 32)) + + // moniker string + monikerBytes := []byte(moniker) + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(monikerBytes))).Bytes(), 32)...) + data = append(data, common.RightPadBytes(monikerBytes, ((len(monikerBytes)+31)/32)*32)...) + + topics := []common.Hash{ + ValidatorCreatedEventSig, + common.BytesToHash(creator.Bytes()), // indexed + } + return topics, data, nil +} + +func EmitValidatorCreatedEvent(evm *vm.EVM, precompileAddr common.Address, creator common.Address, validatorAddr string, moniker string) error { + topics, data, err := BuildValidatorCreatedEvent(creator, validatorAddr, moniker) + if err != nil { + return err + } + return EmitEVMLog(evm, precompileAddr, topics, data) +} + +func BuildValidatorEditedEvent(editor common.Address, validatorAddr string, moniker string) ([]common.Hash, []byte, error) { + // Pack the non-indexed data: validatorAddr string and moniker string + data := make([]byte, 0) + + // Offsets for two strings + data = append(data, common.LeftPadBytes(big.NewInt(64).Bytes(), 32)...) // offset for validatorAddr + data = append(data, common.LeftPadBytes(big.NewInt(128).Bytes(), 32)...) // offset for moniker (approximate) + + // validatorAddr string + valAddrBytes := []byte(validatorAddr) + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(valAddrBytes))).Bytes(), 32)...) + data = append(data, common.RightPadBytes(valAddrBytes, ((len(valAddrBytes)+31)/32)*32)...) + + // Adjust offset for moniker based on actual validatorAddr length + monikerOffset := 64 + 32 + ((len(valAddrBytes)+31)/32)*32 + // Update the moniker offset in data + copy(data[32:64], common.LeftPadBytes(big.NewInt(int64(monikerOffset)).Bytes(), 32)) + + // moniker string + monikerBytes := []byte(moniker) + data = append(data, common.LeftPadBytes(big.NewInt(int64(len(monikerBytes))).Bytes(), 32)...) + data = append(data, common.RightPadBytes(monikerBytes, ((len(monikerBytes)+31)/32)*32)...) + + topics := []common.Hash{ + ValidatorEditedEventSig, + common.BytesToHash(editor.Bytes()), // indexed + } + return topics, data, nil +} + +func EmitValidatorEditedEvent(evm *vm.EVM, precompileAddr common.Address, editor common.Address, validatorAddr string, moniker string) error { + topics, data, err := BuildValidatorEditedEvent(editor, validatorAddr, moniker) + if err != nil { + return err + } + return EmitEVMLog(evm, precompileAddr, topics, data) +} diff --git a/precompiles/common/legacy/v630/precompiles.go b/precompiles/common/legacy/v630/precompiles.go new file mode 100644 index 0000000000..3f412be48d --- /dev/null +++ b/precompiles/common/legacy/v630/precompiles.go @@ -0,0 +1,300 @@ +package v630 + +import ( + "bytes" + "embed" + "errors" + "fmt" + "math/big" + + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils/metrics" + "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const UnknownMethodCallGas uint64 = 3000 + +type Contexter interface { + Ctx() sdk.Context +} + +type StateEVMKeeperGetter interface { + EVMKeeper() state.EVMKeeper +} + +type PrecompileExecutor interface { + RequiredGas([]byte, *abi.Method) uint64 + Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) ([]byte, error) +} + +type Precompile struct { + abi.ABI + address common.Address + name string + executor PrecompileExecutor +} + +var _ vm.PrecompiledContract = &Precompile{} + +func NewPrecompile(a abi.ABI, executor PrecompileExecutor, address common.Address, name string) *Precompile { + return &Precompile{ABI: a, executor: executor, address: address, name: name} +} + +func (p Precompile) RequiredGas(input []byte) uint64 { + methodID, err := ExtractMethodID(input) + if err != nil { + return UnknownMethodCallGas + } + + method, err := p.MethodById(methodID) + if err != nil { + // This should never happen since this method is going to fail during Run + return UnknownMethodCallGas + } + return p.executor.RequiredGas(input[4:], method) +} + +func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool, isFromDelegateCall bool, hooks *tracing.Hooks) (bz []byte, err error) { + operation := fmt.Sprintf("%s_unknown", p.name) + defer func() { + HandlePrecompileError(err, evm, operation) + if err != nil { + err = vm.ErrExecutionReverted + } + }() + ctx, method, args, err := p.Prepare(evm, input) + if err != nil { + return nil, err + } + + operation = method.Name + em := ctx.EventManager() + ctx = ctx.WithEventManager(sdk.NewEventManager()) + ctx = ctx.WithEVMPrecompileCalledFromDelegateCall(isFromDelegateCall) + bz, err = p.executor.Execute(ctx, method, caller, callingContract, args, value, readOnly, evm, hooks) + if err != nil { + return bz, err + } + events := ctx.EventManager().Events() + if len(events) > 0 { + em.EmitEvents(ctx.EventManager().Events()) + } + return bz, err +} + +func HandlePrecompileError(err error, evm *vm.EVM, operation string) { + if err != nil { + if sdb := state.GetDBImpl(evm.StateDB); sdb != nil { + sdb.SetPrecompileError(err) + } + metrics.IncrementErrorMetrics(operation, err) + } +} + +func (p Precompile) Prepare(evm *vm.EVM, input []byte) (sdk.Context, *abi.Method, []interface{}, error) { + ctxer := state.GetDBImpl(evm.StateDB) + if ctxer == nil { + return sdk.Context{}, nil, nil, errors.New("cannot get context from EVM") + } + methodID, err := ExtractMethodID(input) + if err != nil { + return sdk.Context{}, nil, nil, err + } + method, err := p.MethodById(methodID) + if err != nil { + return sdk.Context{}, nil, nil, err + } + + argsBz := input[4:] + args, err := method.Inputs.Unpack(argsBz) + if err != nil { + return sdk.Context{}, nil, nil, err + } + + return ctxer.Ctx(), method, args, nil +} + +func (p Precompile) GetABI() abi.ABI { + return p.ABI +} + +func (p Precompile) Address() common.Address { + return p.address +} + +func (p Precompile) GetName() string { + return p.name +} + +func (p Precompile) GetExecutor() PrecompileExecutor { + return p.executor +} + +type DynamicGasPrecompileExecutor interface { + Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) + EVMKeeper() putils.EVMKeeper +} + +type DynamicGasPrecompile struct { + *Precompile + executor DynamicGasPrecompileExecutor +} + +var _ vm.DynamicGasPrecompiledContract = &DynamicGasPrecompile{} + +func NewDynamicGasPrecompile(a abi.ABI, executor DynamicGasPrecompileExecutor, address common.Address, name string) *DynamicGasPrecompile { + return &DynamicGasPrecompile{Precompile: NewPrecompile(a, nil, address, name), executor: executor} +} + +func (d DynamicGasPrecompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, hooks *tracing.Hooks, readOnly bool, isFromDelegateCall bool) (ret []byte, remainingGas uint64, err error) { + operation := fmt.Sprintf("%s_unknown", d.name) + defer func() { + HandlePrecompileError(err, evm, operation) + if err != nil { + fmt.Printf("precompile %s encountered error: %v\n", d.name, err) + err = vm.ErrExecutionReverted + } + }() + ctx, method, args, err := d.Prepare(evm, input) + if err != nil { + return nil, 0, err + } + gasLimit := d.executor.EVMKeeper().GetCosmosGasLimitFromEVMGas(ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)), suppliedGas) + ctx = ctx.WithGasMeter(sdk.NewGasMeterWithMultiplier(ctx, gasLimit)) + operation = method.Name + em := ctx.EventManager() + ctx = ctx.WithEventManager(sdk.NewEventManager()) + ctx = ctx.WithEVMPrecompileCalledFromDelegateCall(isFromDelegateCall) + ret, remainingGas, err = d.executor.Execute(ctx, method, caller, callingContract, args, value, readOnly, evm, suppliedGas, hooks) + if err != nil { + return ret, remainingGas, err + } + events := ctx.EventManager().Events() + if len(events) > 0 { + em.EmitEvents(ctx.EventManager().Events()) + } + return ret, remainingGas, err +} + +func (d DynamicGasPrecompile) GetExecutor() DynamicGasPrecompileExecutor { + return d.executor +} + +func ValidateArgsLength(args []interface{}, length int) error { + if len(args) != length { + return fmt.Errorf("expected %d arguments but got %d", length, len(args)) + } + + return nil +} + +func ValidateNonPayable(value *big.Int) error { + if value != nil && value.Sign() != 0 { + return errors.New("sending funds to a non-payable function") + } + + return nil +} + +func HandlePaymentUsei(ctx sdk.Context, precompileAddr sdk.AccAddress, payer sdk.AccAddress, value *big.Int, bankKeeper putils.BankKeeper, evmKeeper putils.EVMKeeper, hooks *tracing.Hooks, depth int) (sdk.Coin, error) { + usei, wei := state.SplitUseiWeiAmount(value) + if !wei.IsZero() { + return sdk.Coin{}, fmt.Errorf("selected precompile function does not allow payment with non-zero wei remainder: received %s", value) + } + coin := sdk.NewCoin(sdk.MustGetBaseDenom(), usei) + // refund payer because the following precompile logic will debit the payments from payer's account + // this creates a new event manager to avoid surfacing these as cosmos events + if err := bankKeeper.SendCoins(ctx.WithEventManager(sdk.NewEventManager()), precompileAddr, payer, sdk.NewCoins(coin)); err != nil { + return sdk.Coin{}, err + } + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + if hooks.OnEnter != nil { + hooks.OnEnter(depth+1, byte(vm.CALL), evmKeeper.GetEVMAddressOrDefault(newCtx, precompileAddr), evmKeeper.GetEVMAddressOrDefault(newCtx, payer), []byte{}, GetRemainingGas(newCtx, evmKeeper), value) + } + if hooks.OnExit != nil { + hooks.OnExit(depth+1, []byte{}, 0, nil, false) + } + } + return coin, nil +} + +func HandlePaymentUseiWei(ctx sdk.Context, precompileAddr sdk.AccAddress, payer sdk.AccAddress, value *big.Int, bankKeeper putils.BankKeeper, evmKeeper putils.EVMKeeper, hooks *tracing.Hooks, depth int) (sdk.Int, sdk.Int, error) { + usei, wei := state.SplitUseiWeiAmount(value) + // refund payer because the following precompile logic will debit the payments from payer's account + // this creates a new event manager to avoid surfacing these as cosmos events + if err := bankKeeper.SendCoinsAndWei(ctx.WithEventManager(sdk.NewEventManager()), precompileAddr, payer, usei, wei); err != nil { + return sdk.Int{}, sdk.Int{}, err + } + if hooks != nil { + newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + if hooks.OnEnter != nil { + hooks.OnEnter(depth+1, byte(vm.CALL), evmKeeper.GetEVMAddressOrDefault(newCtx, precompileAddr), evmKeeper.GetEVMAddressOrDefault(newCtx, payer), []byte{}, GetRemainingGas(newCtx, evmKeeper), value) + } + if hooks.OnExit != nil { + hooks.OnExit(depth+1, []byte{}, 0, nil, false) + } + } + return usei, wei, nil +} + +/* +* +sei gas = evm gas * multiplier +sei gas price = fee / sei gas = fee / (evm gas * multiplier) = evm gas / multiplier +*/ +func GetRemainingGas(ctx sdk.Context, evmKeeper putils.EVMKeeper) uint64 { + return evmKeeper.GetEVMGasLimitFromCtx(ctx) +} + +func ExtractMethodID(input []byte) ([]byte, error) { + // Check if the input has at least the length needed for methodID + if len(input) < 4 { + return nil, errors.New("input too short to extract method ID") + } + return input[:4], nil +} + +func DefaultGasCost(input []byte, isTransaction bool) uint64 { + if isTransaction { + return storetypes.KVGasConfig().WriteCostFlat + (storetypes.KVGasConfig().WriteCostPerByte * uint64(len(input))) + } + + return storetypes.KVGasConfig().ReadCostFlat + (storetypes.KVGasConfig().ReadCostPerByte * uint64(len(input))) +} + +func MustGetABI(f embed.FS, filename string) abi.ABI { + abiBz, err := f.ReadFile(filename) + if err != nil { + panic(err) + } + + newAbi, err := abi.JSON(bytes.NewReader(abiBz)) + if err != nil { + panic(err) + } + return newAbi +} + +func GetSeiAddressByEvmAddress(ctx sdk.Context, evmAddress common.Address, evmKeeper putils.EVMKeeper) (sdk.AccAddress, error) { + seiAddr, associated := evmKeeper.GetSeiAddress(ctx, evmAddress) + if !associated { + return nil, types.NewAssociationMissingErr(evmAddress.Hex()) + } + return seiAddr, nil +} + +func GetSeiAddressFromArg(ctx sdk.Context, arg interface{}, evmKeeper putils.EVMKeeper) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + return GetSeiAddressByEvmAddress(ctx, addr, evmKeeper) +} diff --git a/precompiles/distribution/Distribution.sol b/precompiles/distribution/Distribution.sol index d47c389951..7c7ee8ff85 100644 --- a/precompiles/distribution/Distribution.sol +++ b/precompiles/distribution/Distribution.sol @@ -1,12 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -/// @title Distribution Precompile Interface -/// @notice This interface provides access to Cosmos SDK distribution module functionality /// @dev The distribution precompile is deployed at a fixed address and allows EVM contracts to interact with staking rewards address constant DISTR_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000001007; -/// @notice Global instance of the distribution precompile contract IDistr constant DISTR_CONTRACT = IDistr( DISTR_PRECOMPILE_ADDRESS ); @@ -15,6 +12,11 @@ IDistr constant DISTR_CONTRACT = IDistr( /// @notice Interface for interacting with the Cosmos SDK distribution module /// @dev This interface allows managing staking rewards, commission, and withdrawal addresses interface IDistr { + event WithdrawAddressSet(address indexed delegator, address withdrawAddr); + event DelegationRewardsWithdrawn(address indexed delegator, string validator, uint256 amount); + event MultipleDelegationRewardsWithdrawn(address indexed delegator, string[] validators, uint256[] amounts); + event ValidatorCommissionWithdrawn(string indexed validator, uint256 amount); + // Transactions /// @notice Sets the withdrawal address for the caller's staking rewards @@ -46,7 +48,7 @@ interface IDistr { /// @dev Returns rewards from all validators the address has delegated to /// @param delegatorAddress The EVM address of the delegator /// @return rewards Structured data containing all pending rewards - function rewards(address delegatorAddress) external view returns (Rewards rewards); + function rewards(address delegatorAddress) external view returns (Rewards memory rewards); /// @notice Represents a coin/token with amount, decimals, and denomination /// @dev Used to represent various tokens in the Cosmos ecosystem diff --git a/precompiles/distribution/abi.json b/precompiles/distribution/abi.json index 14a803b219..cc5781977c 100755 --- a/precompiles/distribution/abi.json +++ b/precompiles/distribution/abi.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"setWithdrawAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"validators","type":"string[]"}],"name":"withdrawMultipleDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawValidatorCommission","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatorAddress","type":"address"}],"name":"rewards","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct Coin[]","name":"coins","type":"tuple[]"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct Reward[]","name":"rewards","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct Coin[]","name":"total","type":"tuple[]"}],"internalType":"struct Rewards","name":"rewards","type":"tuple"}],"stateMutability":"view","type":"function"}] +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string[]","name":"validators","type":"string[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"MultipleDelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ValidatorCommissionWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"WithdrawAddressSet","type":"event"},{"inputs":[{"internalType":"address","name":"delegatorAddress","type":"address"}],"name":"rewards","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"coins","type":"tuple[]"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IDistr.Reward[]","name":"rewards","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"total","type":"tuple[]"}],"internalType":"struct IDistr.Rewards","name":"rewards","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"setWithdrawAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"validators","type":"string[]"}],"name":"withdrawMultipleDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawValidatorCommission","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index b908bc7e14..63cfff3181 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" "github.com/sei-protocol/sei-chain/precompiles/utils" @@ -25,12 +26,24 @@ const ( WithdrawMultipleDelegationRewardsMethod = "withdrawMultipleDelegationRewards" WithdrawValidatorCommissionMethod = "withdrawValidatorCommission" RewardsMethod = "rewards" + + SetWithdrawAddressEvent = "WithdrawAddressSet" + DelegationRewardsEvent = "DelegationRewardsWithdrawn" + MultipleDelegationRewardsEvent = "MultipleDelegationRewardsWithdrawn" + ValidatorCommissionEvent = "ValidatorCommissionWithdrawn" ) const ( DistrAddress = "0x0000000000000000000000000000000000001007" ) +var ( + SetWithdrawAddressEventSig = crypto.Keccak256Hash([]byte("WithdrawAddressSet(address,address)")) + DelegationRewardsEventSig = crypto.Keccak256Hash([]byte("DelegationRewardsWithdrawn(address,string,uint256)")) + MultipleDelegationRewardsEventSig = crypto.Keccak256Hash([]byte("MultipleDelegationRewardsWithdrawn(address,string[],uint256[])")) + ValidatorCommissionEventSig = crypto.Keccak256Hash([]byte("ValidatorCommissionWithdrawn(string,uint256)")) +) + // Embed abi json file to the executable binary. Needed when importing as dependency. // //go:embed abi.json @@ -46,6 +59,8 @@ type PrecompileExecutor struct { WithdrawMultipleDelegationRewardsID []byte WithdrawValidatorCommissionID []byte RewardsID []byte + + abi abi.ABI } func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { @@ -55,6 +70,7 @@ func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) distrKeeper: keepers.DistributionK(), evmKeeper: keepers.EVMK(), address: common.HexToAddress(DistrAddress), + abi: newAbi, } for name, m := range newAbi.Methods { @@ -84,17 +100,17 @@ func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller if readOnly { return nil, 0, errors.New("cannot call distr precompile from staticcall") } - return p.setWithdrawAddress(ctx, method, caller, args, value) + return p.setWithdrawAddress(ctx, method, caller, args, value, evm) case WithdrawDelegationRewardsMethod: if readOnly { return nil, 0, errors.New("cannot call distr precompile from staticcall") } - return p.withdrawDelegationRewards(ctx, method, caller, args, value) + return p.withdrawDelegationRewards(ctx, method, caller, args, value, evm) case WithdrawMultipleDelegationRewardsMethod: if readOnly { return nil, 0, errors.New("cannot call distr precompile from staticcall") } - return p.withdrawMultipleDelegationRewards(ctx, method, caller, args, value) + return p.withdrawMultipleDelegationRewards(ctx, method, caller, args, value, evm) case WithdrawValidatorCommissionMethod: if err = pcommon.ValidateNonPayable(value); err != nil { return nil, 0, err @@ -102,7 +118,7 @@ func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller if readOnly { return nil, 0, errors.New("cannot call distr precompile from staticcall") } - return p.withdrawValidatorCommission(ctx, method, caller) + return p.withdrawValidatorCommission(ctx, method, caller, evm) case RewardsMethod: return p.rewards(ctx, method, args) } @@ -113,7 +129,7 @@ func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { return p.evmKeeper } -func (p PrecompileExecutor) setWithdrawAddress(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { +func (p PrecompileExecutor) setWithdrawAddress(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { defer func() { if err := recover(); err != nil { ret = nil @@ -148,10 +164,23 @@ func (p PrecompileExecutor) setWithdrawAddress(ctx sdk.Context, method *abi.Meth } ret, rerr = method.Outputs.Pack(true) remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[SetWithdrawAddressEvent].Inputs.NonIndexed().Pack(args[0].(common.Address)) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + SetWithdrawAddressEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } return } -func (p PrecompileExecutor) withdrawDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { +func (p PrecompileExecutor) withdrawDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { defer func() { if err := recover(); err != nil { ret = nil @@ -171,13 +200,26 @@ func (p PrecompileExecutor) withdrawDelegationRewards(ctx sdk.Context, method *a rerr = err return } - _, err = p.withdraw(ctx, delegator, args[0].(string)) + amts, err := p.withdraw(ctx, delegator, args[0].(string)) if err != nil { rerr = err return } ret, rerr = method.Outputs.Pack(true) remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[DelegationRewardsEvent].Inputs.NonIndexed().Pack(args[0].(string), amts.AmountOf(sdk.DefaultBondDenom).BigInt()) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + DelegationRewardsEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } return } @@ -210,7 +252,7 @@ func (p PrecompileExecutor) getDelegator(ctx sdk.Context, caller common.Address) return delegator, nil } -func (p PrecompileExecutor) withdrawMultipleDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { +func (p PrecompileExecutor) withdrawMultipleDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { defer func() { if err := recover(); err != nil { ret = nil @@ -231,16 +273,31 @@ func (p PrecompileExecutor) withdrawMultipleDelegationRewards(ctx sdk.Context, m return } validators := args[0].([]string) + amts := make([]*big.Int, 0, len(validators)) for _, valAddr := range validators { - _, err := p.withdraw(ctx, delegator, valAddr) + amt, err := p.withdraw(ctx, delegator, valAddr) if err != nil { rerr = err return } + amts = append(amts, amt.AmountOf(sdk.DefaultBondDenom).BigInt()) } ret, rerr = method.Outputs.Pack(true) remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[MultipleDelegationRewardsEvent].Inputs.NonIndexed().Pack(validators, amts) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + MultipleDelegationRewardsEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } return } @@ -342,7 +399,7 @@ func getResponseOutput(response *distrtypes.QueryDelegationTotalRewardsResponse) } } -func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method *abi.Method, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { +func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method *abi.Method, caller common.Address, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { defer func() { if err := recover(); err != nil { ret = nil @@ -367,7 +424,7 @@ func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method } // Call the distribution keeper to withdraw validator commission - _, err = p.distrKeeper.WithdrawValidatorCommission(ctx, validator) + amts, err := p.distrKeeper.WithdrawValidatorCommission(ctx, validator) if err != nil { rerr = err return @@ -375,5 +432,18 @@ func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method ret, rerr = method.Outputs.Pack(true) remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[ValidatorCommissionEvent].Inputs.NonIndexed().Pack(amts.AmountOf(sdk.DefaultBondDenom).BigInt()) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + ValidatorCommissionEventSig, + crypto.Keccak256Hash([]byte(validator.String())), + }, logData); err != nil { + rerr = err + return + } return } diff --git a/precompiles/distribution/distribution_test.go b/precompiles/distribution/distribution_test.go index bcd706e6c7..c018931448 100644 --- a/precompiles/distribution/distribution_test.go +++ b/precompiles/distribution/distribution_test.go @@ -126,6 +126,12 @@ func TestWithdraw(t *testing.T) { require.Nil(t, err) require.Empty(t, res.VmError) require.Equal(t, withdrawSeiAddr.String(), testApp.DistrKeeper.GetDelegatorWithdrawAddr(ctx, seiAddr).String()) + receipt, err := k.GetTransientReceipt(ctx, tx.Hash(), 0) + require.Nil(t, err) + require.Equal(t, 1, len(receipt.Logs)) + require.Equal(t, distribution.SetWithdrawAddressEventSig, common.HexToHash(receipt.Logs[0].Topics[0])) + require.Equal(t, common.BytesToHash(evmAddr.Bytes()), common.HexToHash(receipt.Logs[0].Topics[1])) + require.NotEmpty(t, receipt.Logs[0].Data) // withdraw args, err = abi.Pack("withdrawDelegationRewards", val.String()) @@ -154,6 +160,13 @@ func TestWithdraw(t *testing.T) { // reinitialized d, found = testApp.StakingKeeper.GetDelegation(ctx, seiAddr, val) require.True(t, found) + + receipt, err = k.GetTransientReceipt(ctx, tx.Hash(), 0) + require.Nil(t, err) + require.Equal(t, 1, len(receipt.Logs)) + require.Equal(t, distribution.DelegationRewardsEventSig, common.HexToHash(receipt.Logs[0].Topics[0])) + require.Equal(t, common.BytesToHash(evmAddr.Bytes()), common.HexToHash(receipt.Logs[0].Topics[1])) + require.NotEmpty(t, receipt.Logs[0].Data) } func TestWithdrawMultipleDelegationRewards(t *testing.T) { @@ -273,7 +286,7 @@ func setWithdrawAddressAndWithdraw( res, err := msgServer.EVMTransaction(sdk.WrapSDKContext(ctx), req) require.Nil(t, err) require.Empty(t, res.VmError) - seiAddr, _ := testkeeper.PrivateKeyToAddresses(privKey) + seiAddr, evmAddr := testkeeper.PrivateKeyToAddresses(privKey) require.Equal(t, withdrawSeiAddr.String(), testApp.DistrKeeper.GetDelegatorWithdrawAddr(ctx, seiAddr).String()) var validators []string @@ -304,6 +317,13 @@ func setWithdrawAddressAndWithdraw( require.Empty(t, res.VmError) require.Equal(t, uint64(148290), res.GasUsed) + receipt, err := k.GetTransientReceipt(ctx, tx.Hash(), 0) + require.Nil(t, err) + require.Equal(t, 1, len(receipt.Logs)) + require.Equal(t, distribution.MultipleDelegationRewardsEventSig, common.HexToHash(receipt.Logs[0].Topics[0])) + require.Equal(t, common.BytesToHash(evmAddr.Bytes()), common.HexToHash(receipt.Logs[0].Topics[1])) + require.NotEmpty(t, receipt.Logs[0].Data) + // reinitialized for _, val := range vals { _, found := testApp.StakingKeeper.GetDelegation(ctx, seiAddr, val) diff --git a/precompiles/distribution/legacy/v620/abi.json b/precompiles/distribution/legacy/v620/abi.json new file mode 100755 index 0000000000..c3f701a0bb --- /dev/null +++ b/precompiles/distribution/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"setWithdrawAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"validators","type":"string[]"}],"name":"withdrawMultipleDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawValidatorCommission","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatorAddress","type":"address"}],"name":"rewards","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct Coin[]","name":"coins","type":"tuple[]"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct Reward[]","name":"rewards","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct Coin[]","name":"total","type":"tuple[]"}],"internalType":"struct Rewards","name":"rewards","type":"tuple"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/distribution/legacy/v620/distribution.go b/precompiles/distribution/legacy/v620/distribution.go new file mode 100644 index 0000000000..65d3b398e7 --- /dev/null +++ b/precompiles/distribution/legacy/v620/distribution.go @@ -0,0 +1,384 @@ +package v620 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + SetWithdrawAddressMethod = "setWithdrawAddress" + WithdrawDelegationRewardsMethod = "withdrawDelegationRewards" + WithdrawMultipleDelegationRewardsMethod = "withdrawMultipleDelegationRewards" + WithdrawValidatorCommissionMethod = "withdrawValidatorCommission" + RewardsMethod = "rewards" +) + +const ( + DistrAddress = "0x0000000000000000000000000000000000001007" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + distrKeeper utils.DistributionKeeper + evmKeeper utils.EVMKeeper + address common.Address + + SetWithdrawAddrID []byte + WithdrawDelegationRewardsID []byte + WithdrawMultipleDelegationRewardsID []byte + WithdrawValidatorCommissionID []byte + RewardsID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + distrKeeper: keepers.DistributionK(), + evmKeeper: keepers.EVMK(), + address: common.HexToAddress(DistrAddress), + } + + for name, m := range newAbi.Methods { + switch name { + case SetWithdrawAddressMethod: + p.SetWithdrawAddrID = m.ID + case WithdrawDelegationRewardsMethod: + p.WithdrawDelegationRewardsID = m.ID + case WithdrawMultipleDelegationRewardsMethod: + p.WithdrawMultipleDelegationRewardsID = m.ID + case WithdrawValidatorCommissionMethod: + p.WithdrawValidatorCommissionID = m.ID + case RewardsMethod: + p.RewardsID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "distribution"), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall distr") + } + switch method.Name { + case SetWithdrawAddressMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.setWithdrawAddress(ctx, method, caller, args, value) + case WithdrawDelegationRewardsMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawDelegationRewards(ctx, method, caller, args, value) + case WithdrawMultipleDelegationRewardsMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawMultipleDelegationRewards(ctx, method, caller, args, value) + case WithdrawValidatorCommissionMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawValidatorCommission(ctx, method, caller, args, value) + case RewardsMethod: + return p.rewards(ctx, method, args) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) setWithdrawAddress(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if err := pcommon.ValidateNonPayable(value); err != nil { + rerr = err + return + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + delegator, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + withdrawAddr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + rerr = err + return + } + err = p.distrKeeper.SetWithdrawAddr(ctx, delegator, withdrawAddr) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) withdrawDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + err := p.validateInput(value, args, 1) + if err != nil { + rerr = err + return + } + + delegator, err := p.getDelegator(ctx, caller) + if err != nil { + rerr = err + return + } + _, err = p.withdraw(ctx, delegator, args[0].(string)) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) validateInput(value *big.Int, args []interface{}, expectedArgsLength int) error { + if err := pcommon.ValidateNonPayable(value); err != nil { + return err + } + + if err := pcommon.ValidateArgsLength(args, expectedArgsLength); err != nil { + return err + } + + return nil +} + +func (p PrecompileExecutor) withdraw(ctx sdk.Context, delegator sdk.AccAddress, validatorAddress string) (sdk.Coins, error) { + validator, err := sdk.ValAddressFromBech32(validatorAddress) + if err != nil { + return nil, err + } + return p.distrKeeper.WithdrawDelegationRewards(ctx, delegator, validator) +} + +func (p PrecompileExecutor) getDelegator(ctx sdk.Context, caller common.Address) (sdk.AccAddress, error) { + delegator, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + return delegator, nil +} + +func (p PrecompileExecutor) withdrawMultipleDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + err := p.validateInput(value, args, 1) + if err != nil { + rerr = err + return + } + + delegator, err := p.getDelegator(ctx, caller) + if err != nil { + rerr = err + return + } + validators := args[0].([]string) + for _, valAddr := range validators { + _, err := p.withdraw(ctx, delegator, valAddr) + if err != nil { + rerr = err + return + } + } + + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, associated := p.evmKeeper.GetSeiAddress(ctx, addr) + if !associated { + return nil, errors.New("cannot use an unassociated address as withdraw address") + } + return seiAddr, nil +} + +type Coin struct { + Amount *big.Int + Denom string + Decimals *big.Int +} + +type Reward struct { + ValidatorAddress string + Coins []Coin +} + +type Rewards struct { + Rewards []Reward + Total []Coin +} + +func (p PrecompileExecutor) rewards(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + + seiDelegatorAddress, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + rerr = err + return + } + + req := &distrtypes.QueryDelegationTotalRewardsRequest{ + DelegatorAddress: seiDelegatorAddress.String(), + } + + wrappedC := sdk.WrapSDKContext(ctx) + response, err := p.distrKeeper.DelegationTotalRewards(wrappedC, req) + if err != nil { + rerr = err + return + } + + rewardsOutput := getResponseOutput(response) + ret, rerr = method.Outputs.Pack(rewardsOutput) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func getResponseOutput(response *distrtypes.QueryDelegationTotalRewardsResponse) Rewards { + rewards := make([]Reward, 0, len(response.Rewards)) + for _, rewardInfo := range response.Rewards { + coins := make([]Coin, 0, len(rewardInfo.Reward)) + for _, coin := range rewardInfo.Reward { + coins = append(coins, Coin{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + Decimals: big.NewInt(sdk.Precision), + }) + } + rewards = append(rewards, Reward{ + ValidatorAddress: rewardInfo.ValidatorAddress, + Coins: coins, + }) + } + + totalCoins := make([]Coin, 0, len(response.Total)) + for _, coin := range response.Total { + totalCoins = append(totalCoins, Coin{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + Decimals: big.NewInt(sdk.Precision), + }) + } + + return Rewards{ + Rewards: rewards, + Total: totalCoins, + } +} + +func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + err := p.validateInput(value, args, 1) + if err != nil { + rerr = err + return + } + + // The caller must be associated with a validator address + validatorAddr, err := p.getValidatorFromArg(ctx, args[0]) + if err != nil { + rerr = err + return + } + + // Call the distribution keeper to withdraw validator commission + _, err = p.distrKeeper.WithdrawValidatorCommission(ctx, validatorAddr) + if err != nil { + rerr = err + return + } + + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) getValidatorFromArg(ctx sdk.Context, arg interface{}) (sdk.ValAddress, error) { + validatorAddress := arg.(string) + validator, err := sdk.ValAddressFromBech32(validatorAddress) + if err != nil { + return nil, err + } + return validator, nil +} diff --git a/precompiles/distribution/legacy/v630/abi.json b/precompiles/distribution/legacy/v630/abi.json new file mode 100755 index 0000000000..cc5781977c --- /dev/null +++ b/precompiles/distribution/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string[]","name":"validators","type":"string[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"MultipleDelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ValidatorCommissionWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"WithdrawAddressSet","type":"event"},{"inputs":[{"internalType":"address","name":"delegatorAddress","type":"address"}],"name":"rewards","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"coins","type":"tuple[]"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IDistr.Reward[]","name":"rewards","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"total","type":"tuple[]"}],"internalType":"struct IDistr.Rewards","name":"rewards","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"setWithdrawAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"validators","type":"string[]"}],"name":"withdrawMultipleDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawValidatorCommission","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/precompiles/distribution/legacy/v630/distribution.go b/precompiles/distribution/legacy/v630/distribution.go new file mode 100644 index 0000000000..aba69c4def --- /dev/null +++ b/precompiles/distribution/legacy/v630/distribution.go @@ -0,0 +1,449 @@ +package v630 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + SetWithdrawAddressMethod = "setWithdrawAddress" + WithdrawDelegationRewardsMethod = "withdrawDelegationRewards" + WithdrawMultipleDelegationRewardsMethod = "withdrawMultipleDelegationRewards" + WithdrawValidatorCommissionMethod = "withdrawValidatorCommission" + RewardsMethod = "rewards" + + SetWithdrawAddressEvent = "WithdrawAddressSet" + DelegationRewardsEvent = "DelegationRewardsWithdrawn" + MultipleDelegationRewardsEvent = "MultipleDelegationRewardsWithdrawn" + ValidatorCommissionEvent = "ValidatorCommissionWithdrawn" +) + +const ( + DistrAddress = "0x0000000000000000000000000000000000001007" +) + +var ( + SetWithdrawAddressEventSig = crypto.Keccak256Hash([]byte("WithdrawAddressSet(address,address)")) + DelegationRewardsEventSig = crypto.Keccak256Hash([]byte("DelegationRewardsWithdrawn(address,string,uint256)")) + MultipleDelegationRewardsEventSig = crypto.Keccak256Hash([]byte("MultipleDelegationRewardsWithdrawn(address,string[],uint256[])")) + ValidatorCommissionEventSig = crypto.Keccak256Hash([]byte("ValidatorCommissionWithdrawn(string,uint256)")) +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + distrKeeper utils.DistributionKeeper + evmKeeper utils.EVMKeeper + address common.Address + + SetWithdrawAddrID []byte + WithdrawDelegationRewardsID []byte + WithdrawMultipleDelegationRewardsID []byte + WithdrawValidatorCommissionID []byte + RewardsID []byte + + abi abi.ABI +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + distrKeeper: keepers.DistributionK(), + evmKeeper: keepers.EVMK(), + address: common.HexToAddress(DistrAddress), + abi: newAbi, + } + + for name, m := range newAbi.Methods { + switch name { + case SetWithdrawAddressMethod: + p.SetWithdrawAddrID = m.ID + case WithdrawDelegationRewardsMethod: + p.WithdrawDelegationRewardsID = m.ID + case WithdrawMultipleDelegationRewardsMethod: + p.WithdrawMultipleDelegationRewardsID = m.ID + case WithdrawValidatorCommissionMethod: + p.WithdrawValidatorCommissionID = m.ID + case RewardsMethod: + p.RewardsID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "distribution"), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall distr") + } + switch method.Name { + case SetWithdrawAddressMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.setWithdrawAddress(ctx, method, caller, args, value, evm) + case WithdrawDelegationRewardsMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawDelegationRewards(ctx, method, caller, args, value, evm) + case WithdrawMultipleDelegationRewardsMethod: + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawMultipleDelegationRewards(ctx, method, caller, args, value, evm) + case WithdrawValidatorCommissionMethod: + if err = pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if readOnly { + return nil, 0, errors.New("cannot call distr precompile from staticcall") + } + return p.withdrawValidatorCommission(ctx, method, caller, evm) + case RewardsMethod: + return p.rewards(ctx, method, args) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) setWithdrawAddress(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if err := pcommon.ValidateNonPayable(value); err != nil { + rerr = err + return + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + delegator, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + withdrawAddr, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + rerr = err + return + } + err = p.distrKeeper.SetWithdrawAddr(ctx, delegator, withdrawAddr) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[SetWithdrawAddressEvent].Inputs.NonIndexed().Pack(args[0].(common.Address)) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + SetWithdrawAddressEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } + return +} + +func (p PrecompileExecutor) withdrawDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + err := p.validateInput(value, args, 1) + if err != nil { + rerr = err + return + } + + delegator, err := p.getDelegator(ctx, caller) + if err != nil { + rerr = err + return + } + amts, err := p.withdraw(ctx, delegator, args[0].(string)) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[DelegationRewardsEvent].Inputs.NonIndexed().Pack(args[0].(string), amts.AmountOf(sdk.DefaultBondDenom).BigInt()) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + DelegationRewardsEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } + return +} + +func (p PrecompileExecutor) validateInput(value *big.Int, args []interface{}, expectedArgsLength int) error { + if err := pcommon.ValidateNonPayable(value); err != nil { + return err + } + + if err := pcommon.ValidateArgsLength(args, expectedArgsLength); err != nil { + return err + } + + return nil +} + +func (p PrecompileExecutor) withdraw(ctx sdk.Context, delegator sdk.AccAddress, validatorAddress string) (sdk.Coins, error) { + validator, err := sdk.ValAddressFromBech32(validatorAddress) + if err != nil { + return nil, err + } + return p.distrKeeper.WithdrawDelegationRewards(ctx, delegator, validator) +} + +func (p PrecompileExecutor) getDelegator(ctx sdk.Context, caller common.Address) (sdk.AccAddress, error) { + delegator, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + return delegator, nil +} + +func (p PrecompileExecutor) withdrawMultipleDelegationRewards(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + err := p.validateInput(value, args, 1) + if err != nil { + rerr = err + return + } + + delegator, err := p.getDelegator(ctx, caller) + if err != nil { + rerr = err + return + } + validators := args[0].([]string) + amts := make([]*big.Int, 0, len(validators)) + for _, valAddr := range validators { + amt, err := p.withdraw(ctx, delegator, valAddr) + if err != nil { + rerr = err + return + } + amts = append(amts, amt.AmountOf(sdk.DefaultBondDenom).BigInt()) + } + + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[MultipleDelegationRewardsEvent].Inputs.NonIndexed().Pack(validators, amts) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + MultipleDelegationRewardsEventSig, + common.BytesToHash(caller.Bytes()), + }, logData); err != nil { + rerr = err + return + } + return +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, associated := p.evmKeeper.GetSeiAddress(ctx, addr) + if !associated { + return nil, errors.New("cannot use an unassociated address as withdraw address") + } + return seiAddr, nil +} + +type Coin struct { + Amount *big.Int + Denom string + Decimals *big.Int +} + +type Reward struct { + ValidatorAddress string + Coins []Coin +} + +type Rewards struct { + Rewards []Reward + Total []Coin +} + +func (p PrecompileExecutor) rewards(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + + seiDelegatorAddress, err := p.accAddressFromArg(ctx, args[0]) + if err != nil { + rerr = err + return + } + + req := &distrtypes.QueryDelegationTotalRewardsRequest{ + DelegatorAddress: seiDelegatorAddress.String(), + } + + wrappedC := sdk.WrapSDKContext(ctx) + response, err := p.distrKeeper.DelegationTotalRewards(wrappedC, req) + if err != nil { + rerr = err + return + } + + rewardsOutput := getResponseOutput(response) + ret, rerr = method.Outputs.Pack(rewardsOutput) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func getResponseOutput(response *distrtypes.QueryDelegationTotalRewardsResponse) Rewards { + rewards := make([]Reward, 0, len(response.Rewards)) + for _, rewardInfo := range response.Rewards { + coins := make([]Coin, 0, len(rewardInfo.Reward)) + for _, coin := range rewardInfo.Reward { + coins = append(coins, Coin{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + Decimals: big.NewInt(sdk.Precision), + }) + } + rewards = append(rewards, Reward{ + ValidatorAddress: rewardInfo.ValidatorAddress, + Coins: coins, + }) + } + + totalCoins := make([]Coin, 0, len(response.Total)) + for _, coin := range response.Total { + totalCoins = append(totalCoins, Coin{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + Decimals: big.NewInt(sdk.Precision), + }) + } + + return Rewards{ + Rewards: rewards, + Total: totalCoins, + } +} + +func (p PrecompileExecutor) withdrawValidatorCommission(ctx sdk.Context, method *abi.Method, caller common.Address, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + validatorSeiAddr, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + + validatorAddr := sdk.ValAddress(validatorSeiAddr) + + validator, err := sdk.ValAddressFromBech32(validatorAddr.String()) + if err != nil { + rerr = err + return + } + + // Call the distribution keeper to withdraw validator commission + amts, err := p.distrKeeper.WithdrawValidatorCommission(ctx, validator) + if err != nil { + rerr = err + return + } + + ret, rerr = method.Outputs.Pack(true) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + + logData, err := p.abi.Events[ValidatorCommissionEvent].Inputs.NonIndexed().Pack(amts.AmountOf(sdk.DefaultBondDenom).BigInt()) + if err != nil { + rerr = err + return + } + if err := pcommon.EmitEVMLog(evm, p.address, []common.Hash{ + ValidatorCommissionEventSig, + crypto.Keccak256Hash([]byte(validator.String())), + }, logData); err != nil { + rerr = err + return + } + return +} diff --git a/precompiles/distribution/setup.go b/precompiles/distribution/setup.go index a8c87c281c..8320c6dbf9 100644 --- a/precompiles/distribution/setup.go +++ b/precompiles/distribution/setup.go @@ -9,6 +9,8 @@ import ( distributionv605 "github.com/sei-protocol/sei-chain/precompiles/distribution/legacy/v605" distributionv606 "github.com/sei-protocol/sei-chain/precompiles/distribution/legacy/v606" distributionv610 "github.com/sei-protocol/sei-chain/precompiles/distribution/legacy/v610" + distributionv614 "github.com/sei-protocol/sei-chain/precompiles/distribution/legacy/v614" + distributionv620 "github.com/sei-protocol/sei-chain/precompiles/distribution/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -22,6 +24,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(distributionv605.NewPrecompile(keepers)), "v6.0.6": check(distributionv606.NewPrecompile(keepers)), "v6.1.0": check(distributionv610.NewPrecompile(keepers)), + "v6.1.4": check(distributionv614.NewPrecompile(keepers)), + "v6.2.0": check(distributionv620.NewPrecompile(keepers)), } } diff --git a/precompiles/distribution/versions b/precompiles/distribution/versions index 538d4ffc28..5106fe993b 100644 --- a/precompiles/distribution/versions +++ b/precompiles/distribution/versions @@ -6,3 +6,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/gov/legacy/v620/abi.json b/precompiles/gov/legacy/v620/abi.json new file mode 100755 index 0000000000..1c0a870ccf --- /dev/null +++ b/precompiles/gov/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"proposalJSON","type":"string"}],"name":"submitProposal","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"deposit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"int32","name":"option","type":"int32"}],"name":"vote","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"components":[{"internalType":"int32","name":"option","type":"int32"},{"internalType":"string","name":"weight","type":"string"}],"internalType":"struct WeightedVoteOption[]","name":"options","type":"tuple[]"}],"name":"voteWeighted","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/precompiles/gov/legacy/v620/gov.go b/precompiles/gov/legacy/v620/gov.go new file mode 100644 index 0000000000..b613460ba2 --- /dev/null +++ b/precompiles/gov/legacy/v620/gov.go @@ -0,0 +1,294 @@ +package v620 + +import ( + "bytes" + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + VoteMethod = "vote" + VoteWeightedMethod = "voteWeighted" + DepositMethod = "deposit" + SubmitProposalMethod = "submitProposal" +) + +const ( + GovAddress = "0x0000000000000000000000000000000000001006" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + govMsgServer utils.GovMsgServer + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + address common.Address + proposalHandlers map[string]ProposalHandler + + VoteID []byte + VoteWeightedID []byte + DepositID []byte + SubmitProposalID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + govMsgServer: keepers.GovMS(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: common.HexToAddress(GovAddress), + } + + // Register proposal handlers + p.registerProposalHandlers() + + // Register method IDs + for name, m := range newAbi.Methods { + switch name { + case VoteMethod: + p.VoteID = m.ID + case DepositMethod: + p.DepositID = m.ID + case SubmitProposalMethod: + p.SubmitProposalID = m.ID + case VoteWeightedMethod: + p.VoteWeightedID = m.ID + } + } + + // Create the precompile + return pcommon.NewPrecompile(newAbi, p, p.address, "gov"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + if bytes.Equal(method.ID, p.VoteID) || bytes.Equal(method.ID, p.VoteWeightedID) { + return 30000 + } else if bytes.Equal(method.ID, p.DepositID) { + return 30000 + } else if bytes.Equal(method.ID, p.SubmitProposalID) { + return 50000 + } + + // This should never happen since this is going to fail during Run + return pcommon.UnknownMethodCallGas +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { + if readOnly { + return nil, errors.New("cannot call gov precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, errors.New("cannot delegatecall gov") + } + + switch method.Name { + case VoteMethod: + return p.vote(ctx, method, caller, args, value) + case VoteWeightedMethod: + return p.voteWeighted(ctx, method, caller, args, value) + case DepositMethod: + return p.deposit(ctx, method, caller, args, value, hooks, evm) + case SubmitProposalMethod: + return p.submitProposal(ctx, method, caller, args, value, hooks, evm) + } + return +} + +func (p PrecompileExecutor) vote(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + voter, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + voteOption := args[1].(int32) + + msg := govtypes.NewMsgVote(voter, proposalID, govtypes.VoteOption(voteOption)) + err := msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.Vote(goCtx, msg) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) voteWeighted(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + voter, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + + // args[1] is the struct array for weighted vote options + // The ABI decoder gives us the actual struct slice + weightedOptionsStruct := args[1].([]struct { + Option int32 `json:"option"` + Weight string `json:"weight"` + }) + + maxOptions := 4 + if len(weightedOptionsStruct) > maxOptions { + return nil, fmt.Errorf("too many vote options provided: maximum allowed is %d", maxOptions) + } + + // Convert to WeightedVoteOptions + voteOptions := make([]govtypes.WeightedVoteOption, len(weightedOptionsStruct)) + for i, optionStruct := range weightedOptionsStruct { + // Parse weight as decimal + weight, err := sdk.NewDecFromStr(optionStruct.Weight) + if err != nil { + return nil, fmt.Errorf("invalid weight format: %w", err) + } + + voteOptions[i] = govtypes.WeightedVoteOption{ + Option: govtypes.VoteOption(optionStruct.Option), + Weight: weight, + } + } + + msg := govtypes.NewMsgVoteWeighted(voter, proposalID, voteOptions) + err := msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.VoteWeighted(goCtx, msg) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) deposit(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + depositor, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + if value == nil || value.Sign() == 0 { + return nil, errors.New("set `value` field to non-zero to deposit fund") + } + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), depositor, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, err + } + + msg := govtypes.NewMsgDeposit(depositor, proposalID, sdk.NewCoins(coin)) + err = msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.Deposit(goCtx, msg) + if err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) submitProposal(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + + proposer, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse the proposal JSON + proposalJSON := args[0].(string) + var proposal Proposal + if err := json.Unmarshal([]byte(proposalJSON), &proposal); err != nil { + return nil, fmt.Errorf("failed to parse proposal JSON: %w", err) + } + + initialDeposit, err := pcommon.HandlePaymentUsei( + ctx, + p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), + proposer, + value, + p.bankKeeper, + p.evmKeeper, + hooks, + evm.GetDepth()) + + if err != nil { + return nil, err + } + + // Create the proposal content using the handler system + content, err := p.createProposalContent(ctx, proposal) + if err != nil { + return nil, err + } + + // Create the MsgSubmitProposal + msg, err := + govtypes.NewMsgSubmitProposalWithExpedite(content, sdk.NewCoins(initialDeposit), proposer, proposal.IsExpedited) + if err != nil { + return nil, err + } + + // Validate the Msg + err = msg.ValidateBasic() + if err != nil { + return nil, err + } + + // Create a MsgServer context + goCtx := sdk.WrapSDKContext(ctx) + + // Submit the proposal using the MsgServer + res, err := p.govMsgServer.SubmitProposal(goCtx, msg) + if err != nil { + return nil, err + } + + // Return the proposal ID + return method.Outputs.Pack(res.ProposalId) +} diff --git a/precompiles/gov/legacy/v620/handler.go b/precompiles/gov/legacy/v620/handler.go new file mode 100644 index 0000000000..293875c8c7 --- /dev/null +++ b/precompiles/gov/legacy/v620/handler.go @@ -0,0 +1,310 @@ +package v620 + +import ( + "encoding/json" + "errors" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/ethereum/go-ethereum/common" +) + +// EVMKeeper defines the interface for EVM keeper operations +type EVMKeeper interface { + GetSeiAddress(ctx sdk.Context, evmAddr common.Address) (sdk.AccAddress, bool) +} + +// The Proposal represents the structure for proposal JSON input +type Proposal struct { + Title string `json:"title"` + Description string `json:"description"` + Type string `json:"type"` + IsExpedited bool `json:"is_expedited,omitempty"` + // Optional fields for specific proposal types + Plan *SoftwareUpgradePlan `json:"plan,omitempty"` + CommunityPoolSpend *CommunityPoolSpend `json:"community_pool_spend,omitempty"` + ResourceMapping *ResourceDependencyMapping `json:"resource_mapping,omitempty"` + Changes []Change `json:"changes,omitempty"` // For parameter changes and other generic changes +} + +// SoftwareUpgradePlan represents the plan for a software upgrade proposal +type SoftwareUpgradePlan struct { + Name string `json:"name"` + Height int64 `json:"height"` + Info string `json:"info,omitempty"` +} + +// CommunityPoolSpend represents the parameters for a community pool spend proposal +type CommunityPoolSpend struct { + Recipient string `json:"recipient"` // Ethereum address of the recipient + Amount string `json:"amount"` // Amount in the format "1000000usei" +} + +type Change struct { + Subspace string `json:"subspace"` + Key string `json:"key"` + Value interface{} `json:"value"` +} + +// ResourceDependencyMapping defines the structure for mapping a resource to its dependencies +// and access control settings +type ResourceDependencyMapping struct { + Resource string `json:"resource"` + + // Dependencies is a list of message keys that this resource depends on + // Each dependency will be mapped to a MessageDependencyMapping + Dependencies []string `json:"dependencies"` + + // AccessOps defines the sequence of access operations required for this resource + // Must end with AccessType_COMMIT + // Examples: + // - [UNKNOWN, COMMIT] for synchronous operations + // - [READ, COMMIT] for read-only operations + AccessOps []AccessOperation `json:"access_ops"` + + // DynamicEnabled determines if dynamic access control is enabled for this mapping + // When true, allows for runtime modification of access control rules + DynamicEnabled bool `json:"dynamic_enabled"` +} + +// AccessOperation defines a single access control operation +type AccessOperation struct { + // ResourceType specifies the type of resource being accessed + // Examples: + // - ANY: Any resource type + // - KV_STORE: Key-value store + // - BANK: Bank operations + ResourceType string `json:"resource_type"` + + // AccessType specifies the type of access being performed + // Examples: + // - READ: Read access + // - WRITE: Write access + // - COMMIT: Commit access (must be the last operation) + AccessType string `json:"access_type"` + + // IdentifierTemplate specifies the template for resource identification + // Examples: + // - "*" for any identifier + // - "account/{address}" for specific account + IdentifierTemplate string `json:"identifier_template"` +} + +// ProposalHandler defines an interface for handling different proposal types. ProposalHandler implementations to be +// added and registered in below +type ProposalHandler interface { + // HandleProposal creates a Content object from the proposal input + HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) + // Type returns the proposal type this handler can process + Type() string +} + +type TextProposalHandler struct{} + +func (h TextProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + return govtypes.NewTextProposal(proposal.Title, proposal.Description, proposal.IsExpedited), nil +} + +func (h TextProposalHandler) Type() string { + return govtypes.ProposalTypeText +} + +type ParameterChangeProposalHandler struct{} + +func (h ParameterChangeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if len(proposal.Changes) == 0 { + return nil, errors.New("at least one parameter change must be specified") + } + + // Convert changes to ParamChange array + changes := make([]paramstypes.ParamChange, len(proposal.Changes)) + for i, change := range proposal.Changes { + // Convert value to string - this is what ParamChange expects + valueBytes, err := json.Marshal(change.Value) + if err != nil { + return nil, fmt.Errorf("failed to marshal parameter value: %w", err) + } + changes[i] = paramstypes.ParamChange{ + Subspace: change.Subspace, + Key: change.Key, + Value: string(valueBytes), + } + } + + return paramstypes.NewParameterChangeProposal( + proposal.Title, + proposal.Description, + changes, + proposal.IsExpedited, + ), nil +} + +func (h ParameterChangeProposalHandler) Type() string { + return paramstypes.ProposalTypeChange +} + +type SoftwareUpgradeProposalHandler struct{} + +func (h SoftwareUpgradeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if proposal.Plan == nil { + return nil, errors.New("upgrade plan must be specified") + } + + if proposal.Plan.Height == 0 { + return nil, errors.New("upgrade height must be specified") + } + if proposal.Plan.Name == "" { + return nil, errors.New("upgrade name must be specified") + } + + return upgradetypes.NewSoftwareUpgradeProposal( + proposal.Title, + proposal.Description, + upgradetypes.Plan{ + Name: proposal.Plan.Name, + Height: proposal.Plan.Height, + Info: proposal.Plan.Info, + }, + ), nil +} + +func (h SoftwareUpgradeProposalHandler) Type() string { + return upgradetypes.ProposalTypeSoftwareUpgrade +} + +type CancelSoftwareUpgradeProposalHandler struct{} + +func (h CancelSoftwareUpgradeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + // Cancel software upgrade proposals don't need any additional parameters + // They just need title and description which are already validated in createProposalContent + return upgradetypes.NewCancelSoftwareUpgradeProposal( + proposal.Title, + proposal.Description, + ), nil +} + +func (h CancelSoftwareUpgradeProposalHandler) Type() string { + return upgradetypes.ProposalTypeCancelSoftwareUpgrade +} + +type CommunityPoolSpendProposalHandler struct { + evmKeeper EVMKeeper +} + +func (h CommunityPoolSpendProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if proposal.CommunityPoolSpend == nil { + return nil, errors.New("community pool spend parameters must be specified") + } + + // Validate that the recipient is a valid Ethereum address + if !common.IsHexAddress(proposal.CommunityPoolSpend.Recipient) { + return nil, fmt.Errorf("invalid ethereum address format") + } + + // Parse the amount + amount, err := sdk.ParseCoinsNormalized(proposal.CommunityPoolSpend.Amount) + if err != nil { + return nil, fmt.Errorf("invalid amount format: %w", err) + } + + if amount.IsZero() { + return nil, errors.New("amount must be greater than zero") + } + + // Convert Ethereum address to Sei address using the EVM keeper + ethAddr := common.HexToAddress(proposal.CommunityPoolSpend.Recipient) + seiAddr, found := h.evmKeeper.GetSeiAddress(ctx, ethAddr) + if !found { + return nil, fmt.Errorf("no sei address found for ethereum address %s", ethAddr.Hex()) + } + + return distrtypes.NewCommunityPoolSpendProposal( + proposal.Title, + proposal.Description, + seiAddr, + amount, + ), nil +} + +func (h CommunityPoolSpendProposalHandler) Type() string { + return distrtypes.ProposalTypeCommunityPoolSpend +} + +// RegisterProposalHandlers registers all available proposal handlers +func RegisterProposalHandlers(evmKeeper EVMKeeper) map[string]ProposalHandler { + proposalHandlers := make(map[string]ProposalHandler) + + // Register the TextProposalHandler + textHandler := TextProposalHandler{} + proposalHandlers[textHandler.Type()] = textHandler + // Default handler for empty type + proposalHandlers[""] = textHandler + + // Register the ParameterChangeProposalHandler + paramHandler := ParameterChangeProposalHandler{} + proposalHandlers[paramHandler.Type()] = paramHandler + + // Register the SoftwareUpgradeProposalHandler + upgradeHandler := SoftwareUpgradeProposalHandler{} + proposalHandlers[upgradeHandler.Type()] = upgradeHandler + + // Register the CancelSoftwareUpgradeProposalHandler + cancelUpgradeHandler := CancelSoftwareUpgradeProposalHandler{} + proposalHandlers[cancelUpgradeHandler.Type()] = cancelUpgradeHandler + + // Register the CommunityPoolSpendProposalHandler + communityPoolSpendHandler := CommunityPoolSpendProposalHandler{evmKeeper: evmKeeper} + proposalHandlers[communityPoolSpendHandler.Type()] = communityPoolSpendHandler + + return proposalHandlers +} + +// GetProposalHandler returns the appropriate handler for a proposal type +func GetProposalHandler(handlers map[string]ProposalHandler, proposalType string) (ProposalHandler, error) { + handler, ok := handlers[proposalType] + if !ok { + return nil, fmt.Errorf("unsupported proposal type: %s", proposalType) + } + return handler, nil +} + +// createProposalContent creates the appropriate content for a proposal based on its type +func (p PrecompileExecutor) createProposalContent(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + // Validate required fields + if proposal.Title == "" { + return nil, errors.New("proposal title cannot be empty") + } + if proposal.Description == "" { + return nil, errors.New("proposal description cannot be empty") + } + + // Get the appropriate handler for this proposal type + handler, err := GetProposalHandler(p.proposalHandlers, proposal.Type) + if err != nil { + // For unsupported types, provide more specific error messages + switch proposal.Type { + // WASM module proposal types + case "UpdateWasmDependencyMapping", "StoreCode", "InstantiateContract", "MigrateContract", "SudoContract", + "ExecuteContract", "UpdateAdmin", "ClearAdmin", "PinCodes", "UnpinCodes", + "UpdateInstantiateConfig": + return nil, fmt.Errorf("%s proposals are not supported yet via precompile", proposal.Type) + // IBC module proposal types + case "ClientUpdate", "IBCUpgrade": + return nil, fmt.Errorf("%s proposals are not supported yet via precompile", proposal.Type) + default: + return nil, err + } + } + + // Use the handler to create the appropriate content + return handler.HandleProposal(ctx, proposal) +} + +// registerProposalHandlers registers all available proposal handlers +func (p *PrecompileExecutor) registerProposalHandlers() { + p.proposalHandlers = RegisterProposalHandlers(p.evmKeeper) +} diff --git a/precompiles/gov/legacy/v630/abi.json b/precompiles/gov/legacy/v630/abi.json new file mode 100755 index 0000000000..1c0a870ccf --- /dev/null +++ b/precompiles/gov/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"proposalJSON","type":"string"}],"name":"submitProposal","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"deposit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"int32","name":"option","type":"int32"}],"name":"vote","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"components":[{"internalType":"int32","name":"option","type":"int32"},{"internalType":"string","name":"weight","type":"string"}],"internalType":"struct WeightedVoteOption[]","name":"options","type":"tuple[]"}],"name":"voteWeighted","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/precompiles/gov/legacy/v630/gov.go b/precompiles/gov/legacy/v630/gov.go new file mode 100644 index 0000000000..148d43e74d --- /dev/null +++ b/precompiles/gov/legacy/v630/gov.go @@ -0,0 +1,294 @@ +package v630 + +import ( + "bytes" + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + VoteMethod = "vote" + VoteWeightedMethod = "voteWeighted" + DepositMethod = "deposit" + SubmitProposalMethod = "submitProposal" +) + +const ( + GovAddress = "0x0000000000000000000000000000000000001006" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + govMsgServer utils.GovMsgServer + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + address common.Address + proposalHandlers map[string]ProposalHandler + + VoteID []byte + VoteWeightedID []byte + DepositID []byte + SubmitProposalID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + govMsgServer: keepers.GovMS(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: common.HexToAddress(GovAddress), + } + + // Register proposal handlers + p.registerProposalHandlers() + + // Register method IDs + for name, m := range newAbi.Methods { + switch name { + case VoteMethod: + p.VoteID = m.ID + case DepositMethod: + p.DepositID = m.ID + case SubmitProposalMethod: + p.SubmitProposalID = m.ID + case VoteWeightedMethod: + p.VoteWeightedID = m.ID + } + } + + // Create the precompile + return pcommon.NewPrecompile(newAbi, p, p.address, "gov"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + if bytes.Equal(method.ID, p.VoteID) || bytes.Equal(method.ID, p.VoteWeightedID) { + return 30000 + } else if bytes.Equal(method.ID, p.DepositID) { + return 30000 + } else if bytes.Equal(method.ID, p.SubmitProposalID) { + return 50000 + } + + // This should never happen since this is going to fail during Run + return pcommon.UnknownMethodCallGas +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { + if readOnly { + return nil, errors.New("cannot call gov precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, errors.New("cannot delegatecall gov") + } + + switch method.Name { + case VoteMethod: + return p.vote(ctx, method, caller, args, value) + case VoteWeightedMethod: + return p.voteWeighted(ctx, method, caller, args, value) + case DepositMethod: + return p.deposit(ctx, method, caller, args, value, hooks, evm) + case SubmitProposalMethod: + return p.submitProposal(ctx, method, caller, args, value, hooks, evm) + } + return +} + +func (p PrecompileExecutor) vote(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + voter, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + voteOption := args[1].(int32) + + msg := govtypes.NewMsgVote(voter, proposalID, govtypes.VoteOption(voteOption)) + err := msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.Vote(goCtx, msg) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) voteWeighted(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + voter, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + + // args[1] is the struct array for weighted vote options + // The ABI decoder gives us the actual struct slice + weightedOptionsStruct := args[1].([]struct { + Option int32 `json:"option"` + Weight string `json:"weight"` + }) + + maxOptions := 4 + if len(weightedOptionsStruct) > maxOptions { + return nil, fmt.Errorf("too many vote options provided: maximum allowed is %d", maxOptions) + } + + // Convert to WeightedVoteOptions + voteOptions := make([]govtypes.WeightedVoteOption, len(weightedOptionsStruct)) + for i, optionStruct := range weightedOptionsStruct { + // Parse weight as decimal + weight, err := sdk.NewDecFromStr(optionStruct.Weight) + if err != nil { + return nil, fmt.Errorf("invalid weight format: %w", err) + } + + voteOptions[i] = govtypes.WeightedVoteOption{ + Option: govtypes.VoteOption(optionStruct.Option), + Weight: weight, + } + } + + msg := govtypes.NewMsgVoteWeighted(voter, proposalID, voteOptions) + err := msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.VoteWeighted(goCtx, msg) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) deposit(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + depositor, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + proposalID := args[0].(uint64) + if value == nil || value.Sign() == 0 { + return nil, errors.New("set `value` field to non-zero to deposit fund") + } + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), depositor, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, err + } + + msg := govtypes.NewMsgDeposit(depositor, proposalID, sdk.NewCoins(coin)) + err = msg.ValidateBasic() + if err != nil { + return nil, err + } + + goCtx := sdk.WrapSDKContext(ctx) + _, err = p.govMsgServer.Deposit(goCtx, msg) + if err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) submitProposal(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + + proposer, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse the proposal JSON + proposalJSON := args[0].(string) + var proposal Proposal + if err := json.Unmarshal([]byte(proposalJSON), &proposal); err != nil { + return nil, fmt.Errorf("failed to parse proposal JSON: %w", err) + } + + initialDeposit, err := pcommon.HandlePaymentUsei( + ctx, + p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), + proposer, + value, + p.bankKeeper, + p.evmKeeper, + hooks, + evm.GetDepth()) + + if err != nil { + return nil, err + } + + // Create the proposal content using the handler system + content, err := p.createProposalContent(ctx, proposal) + if err != nil { + return nil, err + } + + // Create the MsgSubmitProposal + msg, err := + govtypes.NewMsgSubmitProposalWithExpedite(content, sdk.NewCoins(initialDeposit), proposer, proposal.IsExpedited) + if err != nil { + return nil, err + } + + // Validate the Msg + err = msg.ValidateBasic() + if err != nil { + return nil, err + } + + // Create a MsgServer context + goCtx := sdk.WrapSDKContext(ctx) + + // Submit the proposal using the MsgServer + res, err := p.govMsgServer.SubmitProposal(goCtx, msg) + if err != nil { + return nil, err + } + + // Return the proposal ID + return method.Outputs.Pack(res.ProposalId) +} diff --git a/precompiles/gov/legacy/v630/handler.go b/precompiles/gov/legacy/v630/handler.go new file mode 100644 index 0000000000..8e428d3fa3 --- /dev/null +++ b/precompiles/gov/legacy/v630/handler.go @@ -0,0 +1,310 @@ +package v630 + +import ( + "encoding/json" + "errors" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/ethereum/go-ethereum/common" +) + +// EVMKeeper defines the interface for EVM keeper operations +type EVMKeeper interface { + GetSeiAddress(ctx sdk.Context, evmAddr common.Address) (sdk.AccAddress, bool) +} + +// The Proposal represents the structure for proposal JSON input +type Proposal struct { + Title string `json:"title"` + Description string `json:"description"` + Type string `json:"type"` + IsExpedited bool `json:"is_expedited,omitempty"` + // Optional fields for specific proposal types + Plan *SoftwareUpgradePlan `json:"plan,omitempty"` + CommunityPoolSpend *CommunityPoolSpend `json:"community_pool_spend,omitempty"` + ResourceMapping *ResourceDependencyMapping `json:"resource_mapping,omitempty"` + Changes []Change `json:"changes,omitempty"` // For parameter changes and other generic changes +} + +// SoftwareUpgradePlan represents the plan for a software upgrade proposal +type SoftwareUpgradePlan struct { + Name string `json:"name"` + Height int64 `json:"height"` + Info string `json:"info,omitempty"` +} + +// CommunityPoolSpend represents the parameters for a community pool spend proposal +type CommunityPoolSpend struct { + Recipient string `json:"recipient"` // Ethereum address of the recipient + Amount string `json:"amount"` // Amount in the format "1000000usei" +} + +type Change struct { + Subspace string `json:"subspace"` + Key string `json:"key"` + Value interface{} `json:"value"` +} + +// ResourceDependencyMapping defines the structure for mapping a resource to its dependencies +// and access control settings +type ResourceDependencyMapping struct { + Resource string `json:"resource"` + + // Dependencies is a list of message keys that this resource depends on + // Each dependency will be mapped to a MessageDependencyMapping + Dependencies []string `json:"dependencies"` + + // AccessOps defines the sequence of access operations required for this resource + // Must end with AccessType_COMMIT + // Examples: + // - [UNKNOWN, COMMIT] for synchronous operations + // - [READ, COMMIT] for read-only operations + AccessOps []AccessOperation `json:"access_ops"` + + // DynamicEnabled determines if dynamic access control is enabled for this mapping + // When true, allows for runtime modification of access control rules + DynamicEnabled bool `json:"dynamic_enabled"` +} + +// AccessOperation defines a single access control operation +type AccessOperation struct { + // ResourceType specifies the type of resource being accessed + // Examples: + // - ANY: Any resource type + // - KV_STORE: Key-value store + // - BANK: Bank operations + ResourceType string `json:"resource_type"` + + // AccessType specifies the type of access being performed + // Examples: + // - READ: Read access + // - WRITE: Write access + // - COMMIT: Commit access (must be the last operation) + AccessType string `json:"access_type"` + + // IdentifierTemplate specifies the template for resource identification + // Examples: + // - "*" for any identifier + // - "account/{address}" for specific account + IdentifierTemplate string `json:"identifier_template"` +} + +// ProposalHandler defines an interface for handling different proposal types. ProposalHandler implementations to be +// added and registered in below +type ProposalHandler interface { + // HandleProposal creates a Content object from the proposal input + HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) + // Type returns the proposal type this handler can process + Type() string +} + +type TextProposalHandler struct{} + +func (h TextProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + return govtypes.NewTextProposal(proposal.Title, proposal.Description, proposal.IsExpedited), nil +} + +func (h TextProposalHandler) Type() string { + return govtypes.ProposalTypeText +} + +type ParameterChangeProposalHandler struct{} + +func (h ParameterChangeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if len(proposal.Changes) == 0 { + return nil, errors.New("at least one parameter change must be specified") + } + + // Convert changes to ParamChange array + changes := make([]paramstypes.ParamChange, len(proposal.Changes)) + for i, change := range proposal.Changes { + // Convert value to string - this is what ParamChange expects + valueBytes, err := json.Marshal(change.Value) + if err != nil { + return nil, fmt.Errorf("failed to marshal parameter value: %w", err) + } + changes[i] = paramstypes.ParamChange{ + Subspace: change.Subspace, + Key: change.Key, + Value: string(valueBytes), + } + } + + return paramstypes.NewParameterChangeProposal( + proposal.Title, + proposal.Description, + changes, + proposal.IsExpedited, + ), nil +} + +func (h ParameterChangeProposalHandler) Type() string { + return paramstypes.ProposalTypeChange +} + +type SoftwareUpgradeProposalHandler struct{} + +func (h SoftwareUpgradeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if proposal.Plan == nil { + return nil, errors.New("upgrade plan must be specified") + } + + if proposal.Plan.Height == 0 { + return nil, errors.New("upgrade height must be specified") + } + if proposal.Plan.Name == "" { + return nil, errors.New("upgrade name must be specified") + } + + return upgradetypes.NewSoftwareUpgradeProposal( + proposal.Title, + proposal.Description, + upgradetypes.Plan{ + Name: proposal.Plan.Name, + Height: proposal.Plan.Height, + Info: proposal.Plan.Info, + }, + ), nil +} + +func (h SoftwareUpgradeProposalHandler) Type() string { + return upgradetypes.ProposalTypeSoftwareUpgrade +} + +type CancelSoftwareUpgradeProposalHandler struct{} + +func (h CancelSoftwareUpgradeProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + // Cancel software upgrade proposals don't need any additional parameters + // They just need title and description which are already validated in createProposalContent + return upgradetypes.NewCancelSoftwareUpgradeProposal( + proposal.Title, + proposal.Description, + ), nil +} + +func (h CancelSoftwareUpgradeProposalHandler) Type() string { + return upgradetypes.ProposalTypeCancelSoftwareUpgrade +} + +type CommunityPoolSpendProposalHandler struct { + evmKeeper EVMKeeper +} + +func (h CommunityPoolSpendProposalHandler) HandleProposal(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + if proposal.CommunityPoolSpend == nil { + return nil, errors.New("community pool spend parameters must be specified") + } + + // Validate that the recipient is a valid Ethereum address + if !common.IsHexAddress(proposal.CommunityPoolSpend.Recipient) { + return nil, fmt.Errorf("invalid ethereum address format") + } + + // Parse the amount + amount, err := sdk.ParseCoinsNormalized(proposal.CommunityPoolSpend.Amount) + if err != nil { + return nil, fmt.Errorf("invalid amount format: %w", err) + } + + if amount.IsZero() { + return nil, errors.New("amount must be greater than zero") + } + + // Convert Ethereum address to Sei address using the EVM keeper + ethAddr := common.HexToAddress(proposal.CommunityPoolSpend.Recipient) + seiAddr, found := h.evmKeeper.GetSeiAddress(ctx, ethAddr) + if !found { + return nil, fmt.Errorf("no sei address found for ethereum address %s", ethAddr.Hex()) + } + + return distrtypes.NewCommunityPoolSpendProposal( + proposal.Title, + proposal.Description, + seiAddr, + amount, + ), nil +} + +func (h CommunityPoolSpendProposalHandler) Type() string { + return distrtypes.ProposalTypeCommunityPoolSpend +} + +// RegisterProposalHandlers registers all available proposal handlers +func RegisterProposalHandlers(evmKeeper EVMKeeper) map[string]ProposalHandler { + proposalHandlers := make(map[string]ProposalHandler) + + // Register the TextProposalHandler + textHandler := TextProposalHandler{} + proposalHandlers[textHandler.Type()] = textHandler + // Default handler for empty type + proposalHandlers[""] = textHandler + + // Register the ParameterChangeProposalHandler + paramHandler := ParameterChangeProposalHandler{} + proposalHandlers[paramHandler.Type()] = paramHandler + + // Register the SoftwareUpgradeProposalHandler + upgradeHandler := SoftwareUpgradeProposalHandler{} + proposalHandlers[upgradeHandler.Type()] = upgradeHandler + + // Register the CancelSoftwareUpgradeProposalHandler + cancelUpgradeHandler := CancelSoftwareUpgradeProposalHandler{} + proposalHandlers[cancelUpgradeHandler.Type()] = cancelUpgradeHandler + + // Register the CommunityPoolSpendProposalHandler + communityPoolSpendHandler := CommunityPoolSpendProposalHandler{evmKeeper: evmKeeper} + proposalHandlers[communityPoolSpendHandler.Type()] = communityPoolSpendHandler + + return proposalHandlers +} + +// GetProposalHandler returns the appropriate handler for a proposal type +func GetProposalHandler(handlers map[string]ProposalHandler, proposalType string) (ProposalHandler, error) { + handler, ok := handlers[proposalType] + if !ok { + return nil, fmt.Errorf("unsupported proposal type: %s", proposalType) + } + return handler, nil +} + +// createProposalContent creates the appropriate content for a proposal based on its type +func (p PrecompileExecutor) createProposalContent(ctx sdk.Context, proposal Proposal) (govtypes.Content, error) { + // Validate required fields + if proposal.Title == "" { + return nil, errors.New("proposal title cannot be empty") + } + if proposal.Description == "" { + return nil, errors.New("proposal description cannot be empty") + } + + // Get the appropriate handler for this proposal type + handler, err := GetProposalHandler(p.proposalHandlers, proposal.Type) + if err != nil { + // For unsupported types, provide more specific error messages + switch proposal.Type { + // WASM module proposal types + case "UpdateWasmDependencyMapping", "StoreCode", "InstantiateContract", "MigrateContract", "SudoContract", + "ExecuteContract", "UpdateAdmin", "ClearAdmin", "PinCodes", "UnpinCodes", + "UpdateInstantiateConfig": + return nil, fmt.Errorf("%s proposals are not supported yet via precompile", proposal.Type) + // IBC module proposal types + case "ClientUpdate", "IBCUpgrade": + return nil, fmt.Errorf("%s proposals are not supported yet via precompile", proposal.Type) + default: + return nil, err + } + } + + // Use the handler to create the appropriate content + return handler.HandleProposal(ctx, proposal) +} + +// registerProposalHandlers registers all available proposal handlers +func (p *PrecompileExecutor) registerProposalHandlers() { + p.proposalHandlers = RegisterProposalHandlers(p.evmKeeper) +} diff --git a/precompiles/gov/setup.go b/precompiles/gov/setup.go index 09986d68a6..ec3fe564d1 100644 --- a/precompiles/gov/setup.go +++ b/precompiles/gov/setup.go @@ -9,6 +9,8 @@ import ( govv605 "github.com/sei-protocol/sei-chain/precompiles/gov/legacy/v605" govv606 "github.com/sei-protocol/sei-chain/precompiles/gov/legacy/v606" govv610 "github.com/sei-protocol/sei-chain/precompiles/gov/legacy/v610" + govv614 "github.com/sei-protocol/sei-chain/precompiles/gov/legacy/v614" + govv620 "github.com/sei-protocol/sei-chain/precompiles/gov/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -22,6 +24,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(govv605.NewPrecompile(keepers)), "v6.0.6": check(govv606.NewPrecompile(keepers)), "v6.1.0": check(govv610.NewPrecompile(keepers)), + "v6.1.4": check(govv614.NewPrecompile(keepers)), + "v6.2.0": check(govv620.NewPrecompile(keepers)), } } diff --git a/precompiles/gov/versions b/precompiles/gov/versions index 538d4ffc28..5106fe993b 100644 --- a/precompiles/gov/versions +++ b/precompiles/gov/versions @@ -6,3 +6,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/ibc/legacy/v620/abi.json b/precompiles/ibc/legacy/v620/abi.json new file mode 100644 index 0000000000..5c2809d2dc --- /dev/null +++ b/precompiles/ibc/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferWithDefaultTimeout","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/precompiles/ibc/legacy/v620/ibc.go b/precompiles/ibc/legacy/v620/ibc.go new file mode 100644 index 0000000000..06ac1694d1 --- /dev/null +++ b/precompiles/ibc/legacy/v620/ibc.go @@ -0,0 +1,401 @@ +package v620 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + evmtypes "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + TransferMethod = "transfer" + TransferWithDefaultTimeoutMethod = "transferWithDefaultTimeout" +) + +const ( + IBCAddress = "0x0000000000000000000000000000000000001009" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + transferKeeper utils.TransferKeeper + evmKeeper utils.EVMKeeper + clientKeeper utils.ClientKeeper + connectionKeeper utils.ConnectionKeeper + channelKeeper utils.ChannelKeeper + + TransferID []byte + TransferWithDefaultTimeoutID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + transferKeeper: keepers.TransferK(), + evmKeeper: keepers.EVMK(), + clientKeeper: keepers.ClientK(), + connectionKeeper: keepers.ConnectionK(), + channelKeeper: keepers.ChannelK(), + } + + for name, m := range newAbi.Methods { + switch name { + case TransferMethod: + p.TransferID = m.ID + case TransferWithDefaultTimeoutMethod: + p.TransferWithDefaultTimeoutID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(IBCAddress), "ibc"), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, _ *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err = pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if readOnly { + return nil, 0, errors.New("cannot call IBC precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall IBC") + } + + switch method.Name { + case TransferMethod: + return p.transfer(ctx, method, args, caller) + case TransferWithDefaultTimeoutMethod: + return p.transferWithDefaultTimeout(ctx, method, args, caller) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) transfer(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 9); err != nil { + rerr = err + return + } + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err + return + } + + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { + // short circuit + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return + } + + coin := sdk.Coin{ + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), + } + + revisionNumber, ok := args[5].(uint64) + if !ok { + rerr = errors.New("revisionNumber is not a uint64") + return + } + + revisionHeight, ok := args[6].(uint64) + if !ok { + rerr = errors.New("revisionHeight is not a uint64") + return + } + + height := clienttypes.Height{ + RevisionNumber: revisionNumber, + RevisionHeight: revisionHeight, + } + + timeoutTimestamp, ok := args[7].(uint64) + if !ok { + rerr = errors.New("timeoutTimestamp is not a uint64") + return + } + + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[8], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) + + if err != nil { + rerr = err + return + } + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return +} + +func (p PrecompileExecutor) transferWithDefaultTimeout(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 6); err != nil { + rerr = err + return + } + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err + return + } + + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { + // short circuit + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return + } + + coin := sdk.Coin{ + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), + } + + connection, err := p.getChannelConnection(ctx, validatedArgs.port, validatedArgs.channelID) + + if err != nil { + rerr = err + return + } + + latestConsensusHeight, err := p.getConsensusLatestHeight(ctx, *connection) + if err != nil { + rerr = err + return + } + + height, err := GetAdjustedHeight(*latestConsensusHeight) + if err != nil { + rerr = err + return + } + + timeoutTimestamp, err := p.GetAdjustedTimestamp(ctx, connection.ClientId, *latestConsensusHeight) + if err != nil { + rerr = err + return + } + + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[5], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) + + if err != nil { + rerr = err + return + } + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, addr) + if !found { + return nil, evmtypes.NewAssociationMissingErr(addr.Hex()) + } + return seiAddr, nil +} + +func (p PrecompileExecutor) getChannelConnection(ctx sdk.Context, port string, channelID string) (*connectiontypes.ConnectionEnd, error) { + channel, found := p.channelKeeper.GetChannel(ctx, port, channelID) + if !found { + return nil, errors.New("channel not found") + } + + connection, found := p.connectionKeeper.GetConnection(ctx, channel.ConnectionHops[0]) + + if !found { + return nil, errors.New("connection not found") + } + return &connection, nil +} + +func (p PrecompileExecutor) getConsensusLatestHeight(ctx sdk.Context, connection connectiontypes.ConnectionEnd) (*clienttypes.Height, error) { + clientState, found := p.clientKeeper.GetClientState(ctx, connection.ClientId) + + if !found { + return nil, errors.New("could not get the client state") + } + + latestHeight := clientState.GetLatestHeight() + return &clienttypes.Height{ + RevisionNumber: latestHeight.GetRevisionNumber(), + RevisionHeight: latestHeight.GetRevisionHeight(), + }, nil +} + +func GetAdjustedHeight(latestConsensusHeight clienttypes.Height) (clienttypes.Height, error) { + defaultTimeoutHeight, err := clienttypes.ParseHeight(types.DefaultRelativePacketTimeoutHeight) + if err != nil { + return clienttypes.Height{}, err + } + + absoluteHeight := latestConsensusHeight + absoluteHeight.RevisionNumber += defaultTimeoutHeight.RevisionNumber + absoluteHeight.RevisionHeight += defaultTimeoutHeight.RevisionHeight + return absoluteHeight, nil +} + +func (p PrecompileExecutor) GetAdjustedTimestamp(ctx sdk.Context, clientId string, height clienttypes.Height) (uint64, error) { + consensusState, found := p.clientKeeper.GetClientConsensusState(ctx, clientId, height) + var consensusStateTimestamp uint64 + if found { + consensusStateTimestamp = consensusState.GetTimestamp() + } + + defaultRelativePacketTimeoutTimestamp := types.DefaultRelativePacketTimeoutTimestamp + blockTime := ctx.BlockTime().UnixNano() + if blockTime > 0 { + now := uint64(blockTime) + if now > consensusStateTimestamp { + return now + defaultRelativePacketTimeoutTimestamp, nil + } else { + return consensusStateTimestamp + defaultRelativePacketTimeoutTimestamp, nil + } + } else { + return 0, errors.New("block time is not greater than Jan 1st, 1970 12:00 AM") + } +} + +type ValidatedArgs struct { + senderSeiAddr sdk.AccAddress + receiverAddressString string + port string + channelID string + denom string + amount *big.Int +} + +func (p PrecompileExecutor) validateCommonArgs(ctx sdk.Context, args []interface{}, caller common.Address) (*ValidatedArgs, error) { + senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) + if !ok { + return nil, errors.New("caller is not a valid SEI address") + } + + receiverAddressString, ok := args[0].(string) + if !ok || receiverAddressString == "" { + return nil, errors.New("receiverAddress is not a string or empty") + } + + port, ok := args[1].(string) + if !ok { + return nil, errors.New("port is not a string") + } + if port == "" { + return nil, errors.New("port cannot be empty") + } + + channelID, ok := args[2].(string) + if !ok { + return nil, errors.New("channelID is not a string") + } + if channelID == "" { + return nil, errors.New("channelID cannot be empty") + } + + denom := args[3].(string) + if denom == "" { + return nil, errors.New("invalid denom") + } + + amount, ok := args[4].(*big.Int) + if !ok { + return nil, errors.New("amount is not a big.Int") + } + return &ValidatedArgs{ + senderSeiAddr: senderSeiAddr, + receiverAddressString: receiverAddressString, + port: port, + channelID: channelID, + denom: denom, + amount: amount, + }, nil +} + +func addMemo(memoArg interface{}, transferMsg types.MsgTransfer) types.MsgTransfer { + memo := "" + if memoArg != nil { + memo = memoArg.(string) + } + transferMsg.Memo = memo + return transferMsg +} diff --git a/precompiles/ibc/legacy/v630/abi.json b/precompiles/ibc/legacy/v630/abi.json new file mode 100644 index 0000000000..5c2809d2dc --- /dev/null +++ b/precompiles/ibc/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferWithDefaultTimeout","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/precompiles/ibc/legacy/v630/ibc.go b/precompiles/ibc/legacy/v630/ibc.go new file mode 100644 index 0000000000..631bb499d6 --- /dev/null +++ b/precompiles/ibc/legacy/v630/ibc.go @@ -0,0 +1,401 @@ +package v630 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + evmtypes "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + TransferMethod = "transfer" + TransferWithDefaultTimeoutMethod = "transferWithDefaultTimeout" +) + +const ( + IBCAddress = "0x0000000000000000000000000000000000001009" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + transferKeeper utils.TransferKeeper + evmKeeper utils.EVMKeeper + clientKeeper utils.ClientKeeper + connectionKeeper utils.ConnectionKeeper + channelKeeper utils.ChannelKeeper + + TransferID []byte + TransferWithDefaultTimeoutID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + transferKeeper: keepers.TransferK(), + evmKeeper: keepers.EVMK(), + clientKeeper: keepers.ClientK(), + connectionKeeper: keepers.ConnectionK(), + channelKeeper: keepers.ChannelK(), + } + + for name, m := range newAbi.Methods { + switch name { + case TransferMethod: + p.TransferID = m.ID + case TransferWithDefaultTimeoutMethod: + p.TransferWithDefaultTimeoutID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(IBCAddress), "ibc"), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, _ *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err = pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if readOnly { + return nil, 0, errors.New("cannot call IBC precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall IBC") + } + + switch method.Name { + case TransferMethod: + return p.transfer(ctx, method, args, caller) + case TransferWithDefaultTimeoutMethod: + return p.transferWithDefaultTimeout(ctx, method, args, caller) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) transfer(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 9); err != nil { + rerr = err + return + } + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err + return + } + + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { + // short circuit + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return + } + + coin := sdk.Coin{ + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), + } + + revisionNumber, ok := args[5].(uint64) + if !ok { + rerr = errors.New("revisionNumber is not a uint64") + return + } + + revisionHeight, ok := args[6].(uint64) + if !ok { + rerr = errors.New("revisionHeight is not a uint64") + return + } + + height := clienttypes.Height{ + RevisionNumber: revisionNumber, + RevisionHeight: revisionHeight, + } + + timeoutTimestamp, ok := args[7].(uint64) + if !ok { + rerr = errors.New("timeoutTimestamp is not a uint64") + return + } + + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[8], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) + + if err != nil { + rerr = err + return + } + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return +} + +func (p PrecompileExecutor) transferWithDefaultTimeout(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 6); err != nil { + rerr = err + return + } + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err + return + } + + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { + // short circuit + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return + } + + coin := sdk.Coin{ + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), + } + + connection, err := p.getChannelConnection(ctx, validatedArgs.port, validatedArgs.channelID) + + if err != nil { + rerr = err + return + } + + latestConsensusHeight, err := p.getConsensusLatestHeight(ctx, *connection) + if err != nil { + rerr = err + return + } + + height, err := GetAdjustedHeight(*latestConsensusHeight) + if err != nil { + rerr = err + return + } + + timeoutTimestamp, err := p.GetAdjustedTimestamp(ctx, connection.ClientId, *latestConsensusHeight) + if err != nil { + rerr = err + return + } + + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[5], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) + + if err != nil { + rerr = err + return + } + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return +} + +func (p PrecompileExecutor) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.AccAddress, error) { + addr := arg.(common.Address) + if addr == (common.Address{}) { + return nil, errors.New("invalid addr") + } + seiAddr, found := p.evmKeeper.GetSeiAddress(ctx, addr) + if !found { + return nil, evmtypes.NewAssociationMissingErr(addr.Hex()) + } + return seiAddr, nil +} + +func (p PrecompileExecutor) getChannelConnection(ctx sdk.Context, port string, channelID string) (*connectiontypes.ConnectionEnd, error) { + channel, found := p.channelKeeper.GetChannel(ctx, port, channelID) + if !found { + return nil, errors.New("channel not found") + } + + connection, found := p.connectionKeeper.GetConnection(ctx, channel.ConnectionHops[0]) + + if !found { + return nil, errors.New("connection not found") + } + return &connection, nil +} + +func (p PrecompileExecutor) getConsensusLatestHeight(ctx sdk.Context, connection connectiontypes.ConnectionEnd) (*clienttypes.Height, error) { + clientState, found := p.clientKeeper.GetClientState(ctx, connection.ClientId) + + if !found { + return nil, errors.New("could not get the client state") + } + + latestHeight := clientState.GetLatestHeight() + return &clienttypes.Height{ + RevisionNumber: latestHeight.GetRevisionNumber(), + RevisionHeight: latestHeight.GetRevisionHeight(), + }, nil +} + +func GetAdjustedHeight(latestConsensusHeight clienttypes.Height) (clienttypes.Height, error) { + defaultTimeoutHeight, err := clienttypes.ParseHeight(types.DefaultRelativePacketTimeoutHeight) + if err != nil { + return clienttypes.Height{}, err + } + + absoluteHeight := latestConsensusHeight + absoluteHeight.RevisionNumber += defaultTimeoutHeight.RevisionNumber + absoluteHeight.RevisionHeight += defaultTimeoutHeight.RevisionHeight + return absoluteHeight, nil +} + +func (p PrecompileExecutor) GetAdjustedTimestamp(ctx sdk.Context, clientId string, height clienttypes.Height) (uint64, error) { + consensusState, found := p.clientKeeper.GetClientConsensusState(ctx, clientId, height) + var consensusStateTimestamp uint64 + if found { + consensusStateTimestamp = consensusState.GetTimestamp() + } + + defaultRelativePacketTimeoutTimestamp := types.DefaultRelativePacketTimeoutTimestamp + blockTime := ctx.BlockTime().UnixNano() + if blockTime > 0 { + now := uint64(blockTime) + if now > consensusStateTimestamp { + return now + defaultRelativePacketTimeoutTimestamp, nil + } else { + return consensusStateTimestamp + defaultRelativePacketTimeoutTimestamp, nil + } + } else { + return 0, errors.New("block time is not greater than Jan 1st, 1970 12:00 AM") + } +} + +type ValidatedArgs struct { + senderSeiAddr sdk.AccAddress + receiverAddressString string + port string + channelID string + denom string + amount *big.Int +} + +func (p PrecompileExecutor) validateCommonArgs(ctx sdk.Context, args []interface{}, caller common.Address) (*ValidatedArgs, error) { + senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) + if !ok { + return nil, errors.New("caller is not a valid SEI address") + } + + receiverAddressString, ok := args[0].(string) + if !ok || receiverAddressString == "" { + return nil, errors.New("receiverAddress is not a string or empty") + } + + port, ok := args[1].(string) + if !ok { + return nil, errors.New("port is not a string") + } + if port == "" { + return nil, errors.New("port cannot be empty") + } + + channelID, ok := args[2].(string) + if !ok { + return nil, errors.New("channelID is not a string") + } + if channelID == "" { + return nil, errors.New("channelID cannot be empty") + } + + denom := args[3].(string) + if denom == "" { + return nil, errors.New("invalid denom") + } + + amount, ok := args[4].(*big.Int) + if !ok { + return nil, errors.New("amount is not a big.Int") + } + return &ValidatedArgs{ + senderSeiAddr: senderSeiAddr, + receiverAddressString: receiverAddressString, + port: port, + channelID: channelID, + denom: denom, + amount: amount, + }, nil +} + +func addMemo(memoArg interface{}, transferMsg types.MsgTransfer) types.MsgTransfer { + memo := "" + if memoArg != nil { + memo = memoArg.(string) + } + transferMsg.Memo = memo + return transferMsg +} diff --git a/precompiles/ibc/setup.go b/precompiles/ibc/setup.go index 986dc64bce..f0fd92fecb 100644 --- a/precompiles/ibc/setup.go +++ b/precompiles/ibc/setup.go @@ -11,6 +11,8 @@ import ( ibcv605 "github.com/sei-protocol/sei-chain/precompiles/ibc/legacy/v605" ibcv606 "github.com/sei-protocol/sei-chain/precompiles/ibc/legacy/v606" ibcv610 "github.com/sei-protocol/sei-chain/precompiles/ibc/legacy/v610" + ibcv614 "github.com/sei-protocol/sei-chain/precompiles/ibc/legacy/v614" + ibcv620 "github.com/sei-protocol/sei-chain/precompiles/ibc/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -26,6 +28,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(ibcv605.NewPrecompile(keepers)), "v6.0.6": check(ibcv606.NewPrecompile(keepers)), "v6.1.0": check(ibcv610.NewPrecompile(keepers)), + "v6.1.4": check(ibcv614.NewPrecompile(keepers)), + "v6.2.0": check(ibcv620.NewPrecompile(keepers)), } } diff --git a/precompiles/ibc/versions b/precompiles/ibc/versions index 30c6cde0c6..12ea3bf679 100644 --- a/precompiles/ibc/versions +++ b/precompiles/ibc/versions @@ -8,3 +8,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/json/legacy/v620/abi.json b/precompiles/json/legacy/v620/abi.json new file mode 100644 index 0000000000..48bd4c6f20 --- /dev/null +++ b/precompiles/json/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytes","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytesList","outputs":[{"internalType":"bytes[]","name":"response","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsUint256","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"uint16","name":"arrayIndex","type":"uint16"}],"name":"extractAsBytesFromArray","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/json/legacy/v620/json.go b/precompiles/json/legacy/v620/json.go new file mode 100644 index 0000000000..2b7d3bc5c9 --- /dev/null +++ b/precompiles/json/legacy/v620/json.go @@ -0,0 +1,217 @@ +package v620 + +import ( + "embed" + gjson "encoding/json" + "errors" + "fmt" + "math/big" + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + ExtractAsBytesMethod = "extractAsBytes" + ExtractAsBytesListMethod = "extractAsBytesList" + ExtractAsUint256Method = "extractAsUint256" + ExtractAsBytesFromArrayMethod = "extractAsBytesFromArray" +) + +const JSONAddress = "0x0000000000000000000000000000000000001003" +const GasCostPerByte = 100 // TODO: parameterize + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + ExtractAsBytesID []byte + ExtractAsBytesListID []byte + ExtractAsUint256ID []byte + ExtractAsBytesFromArrayID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{} + + for name, m := range newAbi.Methods { + switch name { + case ExtractAsBytesMethod: + p.ExtractAsBytesID = m.ID + case ExtractAsBytesListMethod: + p.ExtractAsBytesListID = m.ID + case ExtractAsUint256Method: + p.ExtractAsUint256ID = m.ID + case ExtractAsBytesFromArrayMethod: + p.ExtractAsBytesFromArrayID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(JSONAddress), "json"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return uint64(GasCostPerByte * len(input)) //nolint:gosec +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { + switch method.Name { + case ExtractAsBytesMethod: + return p.extractAsBytes(ctx, method, args, value) + case ExtractAsBytesListMethod: + return p.extractAsBytesList(ctx, method, args, value) + case ExtractAsUint256Method: + byteArr := make([]byte, 32) + uint_, err := p.ExtractAsUint256(ctx, method, args, value) + if err != nil { + return nil, err + } + + if uint_.BitLen() > 256 { + return nil, errors.New("value does not fit in 32 bytes") + } + + uint_.FillBytes(byteArr) + return byteArr, nil + case ExtractAsBytesFromArrayMethod: + return p.extractAsBytesFromArray(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) extractAsBytes(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + // in the case of a string value, remove the quotes + if len(result) >= 2 && result[0] == '"' && result[len(result)-1] == '"' { + result = result[1 : len(result)-1] + } + + return method.Outputs.Pack([]byte(result)) +} + +func (p PrecompileExecutor) extractAsBytesList(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + decodedResult := []gjson.RawMessage{} + if err := gjson.Unmarshal(result, &decodedResult); err != nil { + return nil, err + } + + return method.Outputs.Pack(utils.Map(decodedResult, func(r gjson.RawMessage) []byte { return []byte(r) })) +} + +func (p PrecompileExecutor) ExtractAsUint256(_ sdk.Context, _ *abi.Method, args []interface{}, value *big.Int) (*big.Int, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + + // Assuming result is your byte slice + // Convert byte slice to string and trim quotation marks + strValue := strings.Trim(string(result), "\"") + + // Convert the string to big.Int + value, success := new(big.Int).SetString(strValue, 10) + if !success { + return nil, fmt.Errorf("failed to convert %s to big.Int", strValue) + } + + return value, nil +} + +func (p PrecompileExecutor) extractAsBytesFromArray(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + var decoded []gjson.RawMessage + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + if len(decoded) > 1<<16 { + return nil, errors.New("input array is larger than 2^16") + } + index, ok := args[1].(uint16) + if !ok { + return nil, errors.New("index must be uint16") + } + if int(index) >= len(decoded) { + return nil, fmt.Errorf("index %d is out of bounds", index) + } + result := decoded[index] + + // in the case of a string value, remove the quotes + if len(result) >= 2 && result[0] == '"' && result[len(result)-1] == '"' { + result = result[1 : len(result)-1] + } + + return method.Outputs.Pack([]byte(result)) +} diff --git a/precompiles/json/legacy/v630/abi.json b/precompiles/json/legacy/v630/abi.json new file mode 100644 index 0000000000..48bd4c6f20 --- /dev/null +++ b/precompiles/json/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytes","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytesList","outputs":[{"internalType":"bytes[]","name":"response","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsUint256","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"uint16","name":"arrayIndex","type":"uint16"}],"name":"extractAsBytesFromArray","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/json/legacy/v630/json.go b/precompiles/json/legacy/v630/json.go new file mode 100644 index 0000000000..e9ee9fdb84 --- /dev/null +++ b/precompiles/json/legacy/v630/json.go @@ -0,0 +1,217 @@ +package v630 + +import ( + "embed" + gjson "encoding/json" + "errors" + "fmt" + "math/big" + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + ExtractAsBytesMethod = "extractAsBytes" + ExtractAsBytesListMethod = "extractAsBytesList" + ExtractAsUint256Method = "extractAsUint256" + ExtractAsBytesFromArrayMethod = "extractAsBytesFromArray" +) + +const JSONAddress = "0x0000000000000000000000000000000000001003" +const GasCostPerByte = 100 // TODO: parameterize + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + ExtractAsBytesID []byte + ExtractAsBytesListID []byte + ExtractAsUint256ID []byte + ExtractAsBytesFromArrayID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{} + + for name, m := range newAbi.Methods { + switch name { + case ExtractAsBytesMethod: + p.ExtractAsBytesID = m.ID + case ExtractAsBytesListMethod: + p.ExtractAsBytesListID = m.ID + case ExtractAsUint256Method: + p.ExtractAsUint256ID = m.ID + case ExtractAsBytesFromArrayMethod: + p.ExtractAsBytesFromArrayID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(JSONAddress), "json"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return uint64(GasCostPerByte * len(input)) //nolint:gosec +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { + switch method.Name { + case ExtractAsBytesMethod: + return p.extractAsBytes(ctx, method, args, value) + case ExtractAsBytesListMethod: + return p.extractAsBytesList(ctx, method, args, value) + case ExtractAsUint256Method: + byteArr := make([]byte, 32) + uint_, err := p.ExtractAsUint256(ctx, method, args, value) + if err != nil { + return nil, err + } + + if uint_.BitLen() > 256 { + return nil, errors.New("value does not fit in 32 bytes") + } + + uint_.FillBytes(byteArr) + return byteArr, nil + case ExtractAsBytesFromArrayMethod: + return p.extractAsBytesFromArray(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) extractAsBytes(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + // in the case of a string value, remove the quotes + if len(result) >= 2 && result[0] == '"' && result[len(result)-1] == '"' { + result = result[1 : len(result)-1] + } + + return method.Outputs.Pack([]byte(result)) +} + +func (p PrecompileExecutor) extractAsBytesList(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + decodedResult := []gjson.RawMessage{} + if err := gjson.Unmarshal(result, &decodedResult); err != nil { + return nil, err + } + + return method.Outputs.Pack(utils.Map(decodedResult, func(r gjson.RawMessage) []byte { return []byte(r) })) +} + +func (p PrecompileExecutor) ExtractAsUint256(_ sdk.Context, _ *abi.Method, args []interface{}, value *big.Int) (*big.Int, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + decoded := map[string]gjson.RawMessage{} + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + key := args[1].(string) + result, ok := decoded[key] + if !ok { + return nil, fmt.Errorf("input does not contain key %s", key) + } + + // Assuming result is your byte slice + // Convert byte slice to string and trim quotation marks + strValue := strings.Trim(string(result), "\"") + + // Convert the string to big.Int + value, success := new(big.Int).SetString(strValue, 10) + if !success { + return nil, fmt.Errorf("failed to convert %s to big.Int", strValue) + } + + return value, nil +} + +func (p PrecompileExecutor) extractAsBytesFromArray(_ sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + bz := args[0].([]byte) + var decoded []gjson.RawMessage + if err := gjson.Unmarshal(bz, &decoded); err != nil { + return nil, err + } + if len(decoded) > 1<<16 { + return nil, errors.New("input array is larger than 2^16") + } + index, ok := args[1].(uint16) + if !ok { + return nil, errors.New("index must be uint16") + } + if int(index) >= len(decoded) { + return nil, fmt.Errorf("index %d is out of bounds", index) + } + result := decoded[index] + + // in the case of a string value, remove the quotes + if len(result) >= 2 && result[0] == '"' && result[len(result)-1] == '"' { + result = result[1 : len(result)-1] + } + + return method.Outputs.Pack([]byte(result)) +} diff --git a/precompiles/json/setup.go b/precompiles/json/setup.go index 9e511751f3..68979fd855 100644 --- a/precompiles/json/setup.go +++ b/precompiles/json/setup.go @@ -9,6 +9,8 @@ import ( jsonv605 "github.com/sei-protocol/sei-chain/precompiles/json/legacy/v605" jsonv606 "github.com/sei-protocol/sei-chain/precompiles/json/legacy/v606" jsonv610 "github.com/sei-protocol/sei-chain/precompiles/json/legacy/v610" + jsonv614 "github.com/sei-protocol/sei-chain/precompiles/json/legacy/v614" + jsonv620 "github.com/sei-protocol/sei-chain/precompiles/json/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -22,6 +24,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(jsonv605.NewPrecompile(keepers)), "v6.0.6": check(jsonv606.NewPrecompile(keepers)), "v6.1.0": check(jsonv610.NewPrecompile(keepers)), + "v6.1.4": check(jsonv614.NewPrecompile(keepers)), + "v6.2.0": check(jsonv620.NewPrecompile(keepers)), } } diff --git a/precompiles/json/versions b/precompiles/json/versions index e23f81e33c..3adf29f9e2 100644 --- a/precompiles/json/versions +++ b/precompiles/json/versions @@ -6,3 +6,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/oracle/legacy/v620/abi.json b/precompiles/oracle/legacy/v620/abi.json new file mode 100644 index 0000000000..1bb91d96aa --- /dev/null +++ b/precompiles/oracle/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[],"name":"getExchangeRates","outputs":[{"components":[{"internalType":"string","name":"denom","type":"string"},{"components":[{"internalType":"string","name":"exchangeRate","type":"string"},{"internalType":"string","name":"lastUpdate","type":"string"},{"internalType":"int64","name":"lastUpdateTimestamp","type":"int64"}],"internalType":"struct IOracle.OracleExchangeRate","name":"oracleExchangeRateVal","type":"tuple"}],"internalType":"struct IOracle.DenomOracleExchangeRatePair[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"lookback_seconds","type":"uint64"}],"name":"getOracleTwaps","outputs":[{"components":[{"internalType":"string","name":"denom","type":"string"},{"internalType":"string","name":"twap","type":"string"},{"internalType":"int64","name":"lookbackSeconds","type":"int64"}],"internalType":"struct IOracle.OracleTwap[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/oracle/legacy/v620/oracle.go b/precompiles/oracle/legacy/v620/oracle.go new file mode 100644 index 0000000000..59f431bf8a --- /dev/null +++ b/precompiles/oracle/legacy/v620/oracle.go @@ -0,0 +1,146 @@ +package v620 + +import ( + "embed" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/oracle/types" +) + +const ( + GetExchangeRatesMethod = "getExchangeRates" + GetOracleTwapsMethod = "getOracleTwaps" +) + +const ( + OracleAddress = "0x0000000000000000000000000000000000001008" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + oracleKeeper utils.OracleKeeper + + GetExchangeRatesId []byte + GetOracleTwapsId []byte +} + +// Define types which deviate slightly from cosmos types (ExchangeRate string vs sdk.Dec) +type OracleExchangeRate struct { + ExchangeRate string `json:"exchangeRate"` + LastUpdate string `json:"lastUpdate"` + LastUpdateTimestamp int64 `json:"lastUpdateTimestamp"` +} + +type DenomOracleExchangeRatePair struct { + Denom string `json:"denom"` + OracleExchangeRateVal OracleExchangeRate `json:"oracleExchangeRateVal"` +} + +type OracleTwap struct { + Denom string `json:"denom"` + Twap string `json:"twap"` + LookbackSeconds int64 `json:"lookbackSeconds"` +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + oracleKeeper: keepers.OracleK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetExchangeRatesMethod: + p.GetExchangeRatesId = m.ID + case GetOracleTwapsMethod: + p.GetOracleTwapsId = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(OracleAddress), "oracle"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (bz []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case GetExchangeRatesMethod: + return p.getExchangeRates(ctx, method, args, value) + case GetOracleTwapsMethod: + return p.getOracleTwaps(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) getExchangeRates(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + exchangeRates := []DenomOracleExchangeRatePair{} + p.oracleKeeper.IterateBaseExchangeRates(ctx, func(denom string, rate types.OracleExchangeRate) (stop bool) { + exchangeRates = append(exchangeRates, DenomOracleExchangeRatePair{Denom: denom, OracleExchangeRateVal: OracleExchangeRate{ExchangeRate: rate.ExchangeRate.String(), LastUpdate: rate.LastUpdate.String(), LastUpdateTimestamp: rate.LastUpdateTimestamp}}) + return false + }) + + bz, err := method.Outputs.Pack(exchangeRates) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) getOracleTwaps(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + lookbackSeconds := args[0].(uint64) + twaps, err := p.oracleKeeper.CalculateTwaps(ctx, lookbackSeconds) + if err != nil { + return nil, 0, err + } + // Convert twap to string + oracleTwaps := make([]OracleTwap, 0, len(twaps)) + for _, twap := range twaps { + oracleTwaps = append(oracleTwaps, OracleTwap{Denom: twap.Denom, Twap: twap.Twap.String(), LookbackSeconds: twap.LookbackSeconds}) + } + bz, err := method.Outputs.Pack(oracleTwaps) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (PrecompileExecutor) IsTransaction(string) bool { + return false +} diff --git a/precompiles/oracle/legacy/v630/abi.json b/precompiles/oracle/legacy/v630/abi.json new file mode 100644 index 0000000000..1bb91d96aa --- /dev/null +++ b/precompiles/oracle/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[],"name":"getExchangeRates","outputs":[{"components":[{"internalType":"string","name":"denom","type":"string"},{"components":[{"internalType":"string","name":"exchangeRate","type":"string"},{"internalType":"string","name":"lastUpdate","type":"string"},{"internalType":"int64","name":"lastUpdateTimestamp","type":"int64"}],"internalType":"struct IOracle.OracleExchangeRate","name":"oracleExchangeRateVal","type":"tuple"}],"internalType":"struct IOracle.DenomOracleExchangeRatePair[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"lookback_seconds","type":"uint64"}],"name":"getOracleTwaps","outputs":[{"components":[{"internalType":"string","name":"denom","type":"string"},{"internalType":"string","name":"twap","type":"string"},{"internalType":"int64","name":"lookbackSeconds","type":"int64"}],"internalType":"struct IOracle.OracleTwap[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/oracle/legacy/v630/oracle.go b/precompiles/oracle/legacy/v630/oracle.go new file mode 100644 index 0000000000..dcbe9be52c --- /dev/null +++ b/precompiles/oracle/legacy/v630/oracle.go @@ -0,0 +1,146 @@ +package v630 + +import ( + "embed" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/oracle/types" +) + +const ( + GetExchangeRatesMethod = "getExchangeRates" + GetOracleTwapsMethod = "getOracleTwaps" +) + +const ( + OracleAddress = "0x0000000000000000000000000000000000001008" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + oracleKeeper utils.OracleKeeper + + GetExchangeRatesId []byte + GetOracleTwapsId []byte +} + +// Define types which deviate slightly from cosmos types (ExchangeRate string vs sdk.Dec) +type OracleExchangeRate struct { + ExchangeRate string `json:"exchangeRate"` + LastUpdate string `json:"lastUpdate"` + LastUpdateTimestamp int64 `json:"lastUpdateTimestamp"` +} + +type DenomOracleExchangeRatePair struct { + Denom string `json:"denom"` + OracleExchangeRateVal OracleExchangeRate `json:"oracleExchangeRateVal"` +} + +type OracleTwap struct { + Denom string `json:"denom"` + Twap string `json:"twap"` + LookbackSeconds int64 `json:"lookbackSeconds"` +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + oracleKeeper: keepers.OracleK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetExchangeRatesMethod: + p.GetExchangeRatesId = m.ID + case GetOracleTwapsMethod: + p.GetOracleTwapsId = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(OracleAddress), "oracle"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return pcommon.DefaultGasCost(input, p.IsTransaction(method.Name)) +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (bz []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + } + }() + switch method.Name { + case GetExchangeRatesMethod: + return p.getExchangeRates(ctx, method, args, value) + case GetOracleTwapsMethod: + return p.getOracleTwaps(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) getExchangeRates(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + exchangeRates := []DenomOracleExchangeRatePair{} + p.oracleKeeper.IterateBaseExchangeRates(ctx, func(denom string, rate types.OracleExchangeRate) (stop bool) { + exchangeRates = append(exchangeRates, DenomOracleExchangeRatePair{Denom: denom, OracleExchangeRateVal: OracleExchangeRate{ExchangeRate: rate.ExchangeRate.String(), LastUpdate: rate.LastUpdate.String(), LastUpdateTimestamp: rate.LastUpdateTimestamp}}) + return false + }) + + bz, err := method.Outputs.Pack(exchangeRates) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) getOracleTwaps(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + lookbackSeconds := args[0].(uint64) + twaps, err := p.oracleKeeper.CalculateTwaps(ctx, lookbackSeconds) + if err != nil { + return nil, 0, err + } + // Convert twap to string + oracleTwaps := make([]OracleTwap, 0, len(twaps)) + for _, twap := range twaps { + oracleTwaps = append(oracleTwaps, OracleTwap{Denom: twap.Denom, Twap: twap.Twap.String(), LookbackSeconds: twap.LookbackSeconds}) + } + bz, err := method.Outputs.Pack(oracleTwaps) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (PrecompileExecutor) IsTransaction(string) bool { + return false +} diff --git a/precompiles/oracle/setup.go b/precompiles/oracle/setup.go index 838e3d5824..61c276d103 100644 --- a/precompiles/oracle/setup.go +++ b/precompiles/oracle/setup.go @@ -11,6 +11,8 @@ import ( oraclev605 "github.com/sei-protocol/sei-chain/precompiles/oracle/legacy/v605" oraclev606 "github.com/sei-protocol/sei-chain/precompiles/oracle/legacy/v606" oraclev610 "github.com/sei-protocol/sei-chain/precompiles/oracle/legacy/v610" + oraclev614 "github.com/sei-protocol/sei-chain/precompiles/oracle/legacy/v614" + oraclev620 "github.com/sei-protocol/sei-chain/precompiles/oracle/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -26,6 +28,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(oraclev605.NewPrecompile(keepers)), "v6.0.6": check(oraclev606.NewPrecompile(keepers)), "v6.1.0": check(oraclev610.NewPrecompile(keepers)), + "v6.1.4": check(oraclev614.NewPrecompile(keepers)), + "v6.2.0": check(oraclev620.NewPrecompile(keepers)), } } diff --git a/precompiles/oracle/versions b/precompiles/oracle/versions index 5235924c4a..49101387e2 100644 --- a/precompiles/oracle/versions +++ b/precompiles/oracle/versions @@ -8,3 +8,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/p256/legacy/v620/abi.json b/precompiles/p256/legacy/v620/abi.json new file mode 100644 index 0000000000..b1f3541416 --- /dev/null +++ b/precompiles/p256/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/p256/legacy/v620/p256.go b/precompiles/p256/legacy/v620/p256.go new file mode 100644 index 0000000000..0c36c58cea --- /dev/null +++ b/precompiles/p256/legacy/v620/p256.go @@ -0,0 +1,113 @@ +package v620 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/core/tracing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" +) + +const ( + VerifyMethod = "verify" +) + +const ( + P256VerifyAddress = "0x0000000000000000000000000000000000001011" + GasCostPerByte = 300 +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + VerifyID []byte +} + +func NewPrecompile(utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{} + + for name, m := range newAbi.Methods { + switch name { + case VerifyMethod: + p.VerifyID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(P256VerifyAddress), "p256Verify"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return uint64(GasCostPerByte * len(input)) //nolint:gosec +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, err error) { + if err = pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, errors.New("cannot delegatecall P256Verify") + } + + switch method.Name { + case VerifyMethod: + return p.verify(ctx, method, args, caller) + } + return +} + +// verify verifies the secp256r1 signature +// Implements https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md +func (p PrecompileExecutor) verify(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + input := args[0].([]byte) + + // Required input length is 160 bytes + const p256VerifyInputLength = 160 + // Check the input length + if len(input) != p256VerifyInputLength { + // Input length is invalid + rerr = errors.New("invalid input length") + return + } + + // Extract the hash, r, s, x, y from the input + hash := input[0:32] + r, s := new(big.Int).SetBytes(input[32:64]), new(big.Int).SetBytes(input[64:96]) + x, y := new(big.Int).SetBytes(input[96:128]), new(big.Int).SetBytes(input[128:160]) + + // Verify the secp256r1 signature + if Verify(hash, r, s, x, y) { + // Signature is valid + ret, rerr = method.Outputs.Pack(common.LeftPadBytes([]byte{1}, 32)) + return + } else { + // Signature is invalid + return + } +} diff --git a/precompiles/p256/legacy/v620/verifier.go b/precompiles/p256/legacy/v620/verifier.go new file mode 100644 index 0000000000..b07b56fa9b --- /dev/null +++ b/precompiles/p256/legacy/v620/verifier.go @@ -0,0 +1,40 @@ +package v620 + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "math/big" +) + +func newPublicKey(x, y *big.Int) *ecdsa.PublicKey { + // Check if the given coordinates are valid + if x == nil || y == nil || !elliptic.P256().IsOnCurve(x, y) { + return nil + } + + return &ecdsa.PublicKey{ + Curve: elliptic.P256(), + X: x, + Y: y, + } +} + +// Verify verifies the given signature (r, s) for the given hash and public key (x, y). +// It returns true if the signature is valid, false otherwise. +func Verify(hash []byte, r, s, x, y *big.Int) bool { + // Check if the signature is valid + if r == nil || s == nil { + return false + } + // Create the public key format + publicKey := newPublicKey(x, y) + + // Check if they are invalid public key coordinates + if publicKey == nil { + return false + } + + // Verify the signature with the public key, + // then return true if it's valid, false otherwise + return ecdsa.Verify(publicKey, hash, r, s) +} diff --git a/precompiles/p256/legacy/v630/abi.json b/precompiles/p256/legacy/v630/abi.json new file mode 100644 index 0000000000..b1f3541416 --- /dev/null +++ b/precompiles/p256/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/p256/legacy/v630/p256.go b/precompiles/p256/legacy/v630/p256.go new file mode 100644 index 0000000000..148b0e3ac3 --- /dev/null +++ b/precompiles/p256/legacy/v630/p256.go @@ -0,0 +1,113 @@ +package v630 + +import ( + "embed" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/core/tracing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" +) + +const ( + VerifyMethod = "verify" +) + +const ( + P256VerifyAddress = "0x0000000000000000000000000000000000001011" + GasCostPerByte = 300 +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + VerifyID []byte +} + +func NewPrecompile(utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{} + + for name, m := range newAbi.Methods { + switch name { + case VerifyMethod: + p.VerifyID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(P256VerifyAddress), "p256Verify"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + return uint64(GasCostPerByte * len(input)) //nolint:gosec +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, err error) { + if err = pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, errors.New("cannot delegatecall P256Verify") + } + + switch method.Name { + case VerifyMethod: + return p.verify(ctx, method, args, caller) + } + return +} + +// verify verifies the secp256r1 signature +// Implements https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md +func (p PrecompileExecutor) verify(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + input := args[0].([]byte) + + // Required input length is 160 bytes + const p256VerifyInputLength = 160 + // Check the input length + if len(input) != p256VerifyInputLength { + // Input length is invalid + rerr = errors.New("invalid input length") + return + } + + // Extract the hash, r, s, x, y from the input + hash := input[0:32] + r, s := new(big.Int).SetBytes(input[32:64]), new(big.Int).SetBytes(input[64:96]) + x, y := new(big.Int).SetBytes(input[96:128]), new(big.Int).SetBytes(input[128:160]) + + // Verify the secp256r1 signature + if Verify(hash, r, s, x, y) { + // Signature is valid + ret, rerr = method.Outputs.Pack(common.LeftPadBytes([]byte{1}, 32)) + return + } else { + // Signature is invalid + return + } +} diff --git a/precompiles/p256/legacy/v630/verifier.go b/precompiles/p256/legacy/v630/verifier.go new file mode 100644 index 0000000000..320dd1e745 --- /dev/null +++ b/precompiles/p256/legacy/v630/verifier.go @@ -0,0 +1,40 @@ +package v630 + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "math/big" +) + +func newPublicKey(x, y *big.Int) *ecdsa.PublicKey { + // Check if the given coordinates are valid + if x == nil || y == nil || !elliptic.P256().IsOnCurve(x, y) { + return nil + } + + return &ecdsa.PublicKey{ + Curve: elliptic.P256(), + X: x, + Y: y, + } +} + +// Verify verifies the given signature (r, s) for the given hash and public key (x, y). +// It returns true if the signature is valid, false otherwise. +func Verify(hash []byte, r, s, x, y *big.Int) bool { + // Check if the signature is valid + if r == nil || s == nil { + return false + } + // Create the public key format + publicKey := newPublicKey(x, y) + + // Check if they are invalid public key coordinates + if publicKey == nil { + return false + } + + // Verify the signature with the public key, + // then return true if it's valid, false otherwise + return ecdsa.Verify(publicKey, hash, r, s) +} diff --git a/precompiles/p256/setup.go b/precompiles/p256/setup.go index 30ce6fc70f..0d2e178ad9 100644 --- a/precompiles/p256/setup.go +++ b/precompiles/p256/setup.go @@ -3,6 +3,8 @@ package p256 import ( "github.com/ethereum/go-ethereum/core/vm" p256v606 "github.com/sei-protocol/sei-chain/precompiles/p256/legacy/v606" + p256v614 "github.com/sei-protocol/sei-chain/precompiles/p256/legacy/v614" + p256v620 "github.com/sei-protocol/sei-chain/precompiles/p256/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -10,6 +12,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr return utils.VersionedPrecompiles{ latestUpgrade: check(NewPrecompile(keepers)), "v6.0.6": check(p256v606.NewPrecompile(keepers)), + "v6.1.4": check(p256v614.NewPrecompile(keepers)), + "v6.2.0": check(p256v620.NewPrecompile(keepers)), } } diff --git a/precompiles/p256/versions b/precompiles/p256/versions index 1e08c15997..926ba3ac9f 100644 --- a/precompiles/p256/versions +++ b/precompiles/p256/versions @@ -1,2 +1,4 @@ v6.0.6 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/pointer/legacy/v620/abi.json b/precompiles/pointer/legacy/v620/abi.json new file mode 100644 index 0000000000..6f96c19598 --- /dev/null +++ b/precompiles/pointer/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW1155Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW20Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW721Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"token","type":"string"}],"name":"addNativePointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"}] \ No newline at end of file diff --git a/precompiles/pointer/legacy/v620/pointer.go b/precompiles/pointer/legacy/v620/pointer.go new file mode 100644 index 0000000000..14552a4444 --- /dev/null +++ b/precompiles/pointer/legacy/v620/pointer.go @@ -0,0 +1,228 @@ +package v620 + +import ( + "embed" + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + ethabi "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + PrecompileName = "pointer" + AddNativePointer = "addNativePointer" + AddCW20Pointer = "addCW20Pointer" + AddCW721Pointer = "addCW721Pointer" + AddCW1155Pointer = "addCW1155Pointer" +) + +const PointerAddress = "0x000000000000000000000000000000000000100b" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + wasmdKeeper putils.WasmdViewKeeper + + AddNativePointerID []byte + AddCW20PointerID []byte + AddCW721PointerID []byte + AddCW1155PointerID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + wasmdKeeper: keepers.WasmdVK(), + } + + for name, m := range newAbi.Methods { + switch name { + case AddNativePointer: + p.AddNativePointerID = m.ID + case AddCW20Pointer: + p.AddCW20PointerID = m.ID + case AddCW721Pointer: + p.AddCW721PointerID = m.ID + case AddCW1155Pointer: + p.AddCW1155PointerID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(PointerAddress), PrecompileName), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *ethabi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if readOnly { + return nil, 0, errors.New("cannot call pointer precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall pointer") + } + + switch method.Name { + case AddNativePointer: + return p.AddNative(ctx, method, caller, args, value, evm, hooks) + case AddCW20Pointer: + return p.AddCW20(ctx, method, caller, args, value, evm, hooks) + case AddCW721Pointer: + return p.AddCW721(ctx, method, caller, args, value, evm, hooks) + case AddCW1155Pointer: + return p.AddCW1155(ctx, method, caller, args, value, evm, hooks) + default: + err = fmt.Errorf("unknown method %s", method.Name) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) AddNative(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + token := args[0].(string) + metadata, metadataExists := p.bankKeeper.GetDenomMetaData(ctx, token) + if !metadataExists { + return nil, 0, fmt.Errorf("denom %s does not have metadata stored and thus can only have its pointer set through gov proposal", token) + } + name := metadata.Name + symbol := metadata.Symbol + var decimals uint8 + for _, denomUnit := range metadata.DenomUnits { + if denomUnit.Exponent > uint32(decimals) && denomUnit.Exponent <= math.MaxUint8 { + decimals = uint8(denomUnit.Exponent) + name = denomUnit.Denom + symbol = denomUnit.Denom + if len(denomUnit.Aliases) > 0 { + name = denomUnit.Aliases[0] + } + } + } + contractAddr, err := p.evmKeeper.UpsertERCNativePointer(ctx, evm, token, utils.ERCMetadata{Name: name, Symbol: symbol, Decimals: decimals}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW20(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"token_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW20Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW721(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"contract_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW721Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW1155(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"contract_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW1155Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} diff --git a/precompiles/pointer/legacy/v630/abi.json b/precompiles/pointer/legacy/v630/abi.json new file mode 100644 index 0000000000..6f96c19598 --- /dev/null +++ b/precompiles/pointer/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW1155Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW20Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"addCW721Pointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"token","type":"string"}],"name":"addNativePointer","outputs":[{"internalType":"address","name":"ret","type":"address"}],"stateMutability":"payable","type":"function"}] \ No newline at end of file diff --git a/precompiles/pointer/legacy/v630/pointer.go b/precompiles/pointer/legacy/v630/pointer.go new file mode 100644 index 0000000000..3adf1b33fe --- /dev/null +++ b/precompiles/pointer/legacy/v630/pointer.go @@ -0,0 +1,228 @@ +package v630 + +import ( + "embed" + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + ethabi "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + PrecompileName = "pointer" + AddNativePointer = "addNativePointer" + AddCW20Pointer = "addCW20Pointer" + AddCW721Pointer = "addCW721Pointer" + AddCW1155Pointer = "addCW1155Pointer" +) + +const PointerAddress = "0x000000000000000000000000000000000000100b" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + wasmdKeeper putils.WasmdViewKeeper + + AddNativePointerID []byte + AddCW20PointerID []byte + AddCW721PointerID []byte + AddCW1155PointerID []byte +} + +func NewPrecompile(keepers putils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + wasmdKeeper: keepers.WasmdVK(), + } + + for name, m := range newAbi.Methods { + switch name { + case AddNativePointer: + p.AddNativePointerID = m.ID + case AddCW20Pointer: + p.AddCW20PointerID = m.ID + case AddCW721Pointer: + p.AddCW721PointerID = m.ID + case AddCW1155Pointer: + p.AddCW1155PointerID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, common.HexToAddress(PointerAddress), PrecompileName), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *ethabi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if readOnly { + return nil, 0, errors.New("cannot call pointer precompile from staticcall") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall pointer") + } + + switch method.Name { + case AddNativePointer: + return p.AddNative(ctx, method, caller, args, value, evm, hooks) + case AddCW20Pointer: + return p.AddCW20(ctx, method, caller, args, value, evm, hooks) + case AddCW721Pointer: + return p.AddCW721(ctx, method, caller, args, value, evm, hooks) + case AddCW1155Pointer: + return p.AddCW1155(ctx, method, caller, args, value, evm, hooks) + default: + err = fmt.Errorf("unknown method %s", method.Name) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) AddNative(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + token := args[0].(string) + metadata, metadataExists := p.bankKeeper.GetDenomMetaData(ctx, token) + if !metadataExists { + return nil, 0, fmt.Errorf("denom %s does not have metadata stored and thus can only have its pointer set through gov proposal", token) + } + name := metadata.Name + symbol := metadata.Symbol + var decimals uint8 + for _, denomUnit := range metadata.DenomUnits { + if denomUnit.Exponent > uint32(decimals) && denomUnit.Exponent <= math.MaxUint8 { + decimals = uint8(denomUnit.Exponent) + name = denomUnit.Denom + symbol = denomUnit.Denom + if len(denomUnit.Aliases) > 0 { + name = denomUnit.Aliases[0] + } + } + } + contractAddr, err := p.evmKeeper.UpsertERCNativePointer(ctx, evm, token, utils.ERCMetadata{Name: name, Symbol: symbol, Decimals: decimals}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW20(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"token_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW20Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW721(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"contract_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW721Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) AddCW1155(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + cwAddr := args[0].(string) + cwAddress, err := sdk.AccAddressFromBech32(cwAddr) + if err != nil { + return nil, 0, err + } + res, err := p.wasmdKeeper.QuerySmartSafe(ctx, cwAddress, []byte("{\"contract_info\":{}}")) + if err != nil { + return nil, 0, err + } + formattedRes := map[string]interface{}{} + if err := json.Unmarshal(res, &formattedRes); err != nil { + return nil, 0, err + } + name := formattedRes["name"].(string) + symbol := formattedRes["symbol"].(string) + contractAddr, err := p.evmKeeper.UpsertERCCW1155Pointer(ctx, evm, cwAddr, utils.ERCMetadata{Name: name, Symbol: symbol}) + if err != nil { + return nil, 0, err + } + + ret, err = method.Outputs.Pack(contractAddr) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} diff --git a/precompiles/pointer/setup.go b/precompiles/pointer/setup.go index ba536980d4..19bf0b434c 100644 --- a/precompiles/pointer/setup.go +++ b/precompiles/pointer/setup.go @@ -11,6 +11,8 @@ import ( pointerv605 "github.com/sei-protocol/sei-chain/precompiles/pointer/legacy/v605" pointerv606 "github.com/sei-protocol/sei-chain/precompiles/pointer/legacy/v606" pointerv610 "github.com/sei-protocol/sei-chain/precompiles/pointer/legacy/v610" + pointerv614 "github.com/sei-protocol/sei-chain/precompiles/pointer/legacy/v614" + pointerv620 "github.com/sei-protocol/sei-chain/precompiles/pointer/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -26,6 +28,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(pointerv605.NewPrecompile(keepers)), "v6.0.6": check(pointerv606.NewPrecompile(keepers)), "v6.1.0": check(pointerv610.NewPrecompile(keepers)), + "v6.1.4": check(pointerv614.NewPrecompile(keepers)), + "v6.2.0": check(pointerv620.NewPrecompile(keepers)), } } diff --git a/precompiles/pointer/versions b/precompiles/pointer/versions index 9cae43837d..191822e5a8 100644 --- a/precompiles/pointer/versions +++ b/precompiles/pointer/versions @@ -8,3 +8,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/pointerview/legacy/v620/abi.json b/precompiles/pointerview/legacy/v620/abi.json new file mode 100644 index 0000000000..c089390d17 --- /dev/null +++ b/precompiles/pointerview/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW1155Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW20Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW721Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"token","type":"string"}],"name":"getNativePointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/pointerview/legacy/v620/pointerview.go b/precompiles/pointerview/legacy/v620/pointerview.go new file mode 100644 index 0000000000..906246e7a1 --- /dev/null +++ b/precompiles/pointerview/legacy/v620/pointerview.go @@ -0,0 +1,121 @@ +package v620 + +import ( + "embed" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" +) + +const ( + GetNativePointer = "getNativePointer" + GetCW20Pointer = "getCW20Pointer" + GetCW721Pointer = "getCW721Pointer" + GetCW1155Pointer = "getCW1155Pointer" +) + +const PointerViewAddress = "0x000000000000000000000000000000000000100A" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + + GetNativePointerID []byte + GetCW20PointerID []byte + GetCW721PointerID []byte + GetCW1155PointerID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetNativePointer: + p.GetNativePointerID = m.ID + case GetCW20Pointer: + p.GetCW20PointerID = m.ID + case GetCW721Pointer: + p.GetCW721PointerID = m.ID + case GetCW1155Pointer: + p.GetCW1155PointerID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(PointerViewAddress), "pointerview"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas([]byte, *abi.Method) uint64 { + return 2000 +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + switch method.Name { + case GetNativePointer: + return p.GetNative(ctx, method, args) + case GetCW20Pointer: + return p.GetCW20(ctx, method, args) + case GetCW721Pointer: + return p.GetCW721(ctx, method, args) + case GetCW1155Pointer: + return p.GetCW1155(ctx, method, args) + default: + err = fmt.Errorf("unknown method %s", method.Name) + } + return +} + +func (p PrecompileExecutor) GetNative(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + token := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC20NativePointer(ctx, token) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW20(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC20CW20Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW721(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC721CW721Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW1155(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} diff --git a/precompiles/pointerview/legacy/v630/abi.json b/precompiles/pointerview/legacy/v630/abi.json new file mode 100644 index 0000000000..c089390d17 --- /dev/null +++ b/precompiles/pointerview/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW1155Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW20Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"cwAddr","type":"string"}],"name":"getCW721Pointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"token","type":"string"}],"name":"getNativePointer","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/pointerview/legacy/v630/pointerview.go b/precompiles/pointerview/legacy/v630/pointerview.go new file mode 100644 index 0000000000..f056e3b5df --- /dev/null +++ b/precompiles/pointerview/legacy/v630/pointerview.go @@ -0,0 +1,121 @@ +package v630 + +import ( + "embed" + "fmt" + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" +) + +const ( + GetNativePointer = "getNativePointer" + GetCW20Pointer = "getCW20Pointer" + GetCW721Pointer = "getCW721Pointer" + GetCW1155Pointer = "getCW1155Pointer" +) + +const PointerViewAddress = "0x000000000000000000000000000000000000100A" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + + GetNativePointerID []byte + GetCW20PointerID []byte + GetCW721PointerID []byte + GetCW1155PointerID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + evmKeeper: keepers.EVMK(), + } + + for name, m := range newAbi.Methods { + switch name { + case GetNativePointer: + p.GetNativePointerID = m.ID + case GetCW20Pointer: + p.GetCW20PointerID = m.ID + case GetCW721Pointer: + p.GetCW721PointerID = m.ID + case GetCW1155Pointer: + p.GetCW1155PointerID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, common.HexToAddress(PointerViewAddress), "pointerview"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas([]byte, *abi.Method) uint64 { + return 2000 +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (ret []byte, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + switch method.Name { + case GetNativePointer: + return p.GetNative(ctx, method, args) + case GetCW20Pointer: + return p.GetCW20(ctx, method, args) + case GetCW721Pointer: + return p.GetCW721(ctx, method, args) + case GetCW1155Pointer: + return p.GetCW1155(ctx, method, args) + default: + err = fmt.Errorf("unknown method %s", method.Name) + } + return +} + +func (p PrecompileExecutor) GetNative(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + token := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC20NativePointer(ctx, token) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW20(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC20CW20Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW721(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC721CW721Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} + +func (p PrecompileExecutor) GetCW1155(ctx sdk.Context, method *abi.Method, args []interface{}) (ret []byte, err error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + addr := args[0].(string) + existingAddr, existingVersion, exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, addr) + return method.Outputs.Pack(existingAddr, existingVersion, exists) +} diff --git a/precompiles/pointerview/setup.go b/precompiles/pointerview/setup.go index 92fbbc85f6..8ef4e6542c 100644 --- a/precompiles/pointerview/setup.go +++ b/precompiles/pointerview/setup.go @@ -8,6 +8,8 @@ import ( pointerviewv605 "github.com/sei-protocol/sei-chain/precompiles/pointerview/legacy/v605" pointerviewv606 "github.com/sei-protocol/sei-chain/precompiles/pointerview/legacy/v606" pointerviewv610 "github.com/sei-protocol/sei-chain/precompiles/pointerview/legacy/v610" + pointerviewv614 "github.com/sei-protocol/sei-chain/precompiles/pointerview/legacy/v614" + pointerviewv620 "github.com/sei-protocol/sei-chain/precompiles/pointerview/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -20,6 +22,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(pointerviewv605.NewPrecompile(keepers)), "v6.0.6": check(pointerviewv606.NewPrecompile(keepers)), "v6.1.0": check(pointerviewv610.NewPrecompile(keepers)), + "v6.1.4": check(pointerviewv614.NewPrecompile(keepers)), + "v6.2.0": check(pointerviewv620.NewPrecompile(keepers)), } } diff --git a/precompiles/pointerview/versions b/precompiles/pointerview/versions index a38b40d255..644074277f 100644 --- a/precompiles/pointerview/versions +++ b/precompiles/pointerview/versions @@ -5,3 +5,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/solo/legacy/v620/abi.json b/precompiles/solo/legacy/v620/abi.json new file mode 100644 index 0000000000..37adc6f0e6 --- /dev/null +++ b/precompiles/solo/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"claim","outputs":[{"internalType":"bool","name":"response","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"claimSpecific","outputs":[{"internalType":"bool","name":"response","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/precompiles/solo/legacy/v620/solo.go b/precompiles/solo/legacy/v620/solo.go new file mode 100644 index 0000000000..eca1bc55eb --- /dev/null +++ b/precompiles/solo/legacy/v620/solo.go @@ -0,0 +1,383 @@ +package v620 + +import ( + "bytes" + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + authante "github.com/cosmos/cosmos-sdk/x/auth/ante" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + ClaimMethod = "claim" + ClaimSpecificMethod = "claimSpecific" +) + +const SoloAddress = "0x000000000000000000000000000000000000100C" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var F embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + accountKeeper putils.AccountKeeper + wasmKeeper putils.WasmdKeeper + wasmViewKeeper putils.WasmdViewKeeper + + txConfig client.TxConfig + + ClaimMethodID []byte + ClaimSpecificMethodID []byte +} + +func NewPrecompile( + keepers putils.Keepers, +) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(F, "abi.json") + + return pcommon.NewDynamicGasPrecompile( + newAbi, NewExecutor(newAbi, keepers.EVMK(), keepers.BankK(), keepers.AccountK(), keepers.WasmdK(), keepers.WasmdVK(), keepers.TxConfig()), + common.HexToAddress(SoloAddress), "solo"), nil +} + +func NewExecutor( + a abi.ABI, + evmKeeper putils.EVMKeeper, + bankKeeper putils.BankKeeper, + accountKeeper putils.AccountKeeper, + wasmKeeper putils.WasmdKeeper, + wasmViewKeeper putils.WasmdViewKeeper, + txConfig client.TxConfig, +) *PrecompileExecutor { + p := &PrecompileExecutor{ + evmKeeper: evmKeeper, + bankKeeper: bankKeeper, + accountKeeper: accountKeeper, + wasmKeeper: wasmKeeper, + wasmViewKeeper: wasmViewKeeper, + txConfig: txConfig, + } + + for name, m := range a.Methods { + switch name { + case ClaimMethod: + p.ClaimMethodID = m.ID + case ClaimSpecificMethod: + p.ClaimSpecificMethodID = m.ID + } + } + return p +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, _ *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + ret = nil + remainingGas = 0 + return + } + }() + if !ctx.IsEVM() { + return nil, 0, errors.New("cannot claim from a CW call") + } + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if !ctx.IsEVM() || ctx.EVMEntryViaWasmdPrecompile() { + return nil, 0, errors.New("cannot claim from cosmos entry") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall claim") + } + // depth is incremented upon entering the precompile call so it's + // expected to be 1. + if evm.GetDepth() > 1 { + return nil, 0, errors.New("claim must be called by an EOA directly") + } + switch method.Name { + case ClaimMethod: + return p.Claim(ctx, caller, method, args, readOnly) + case ClaimSpecificMethod: + return p.ClaimSpecific(ctx, caller, method, args, readOnly) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +type claimMsg interface { + GetClaimer() string + GetSender() string +} + +type claimSpecificMsg interface { + claimMsg + GetIAssets() []utils.IAsset +} + +func (p PrecompileExecutor) Claim(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, readOnly bool) (ret []byte, remainingGas uint64, err error) { + claimMsg, sender, err := p.validate(ctx, caller, args, readOnly) + if err != nil { + return nil, 0, err + } + _, ok := claimMsg.(claimSpecificMsg) + if ok { + return nil, 0, errors.New("message for Claim must not be MsgClaimSpecific type") + } + if err := p.bankKeeper.SendCoins(ctx, sender, + p.evmKeeper.GetSeiAddressOrDefault(ctx, caller), p.bankKeeper.GetAllBalances(ctx, sender)); err != nil { + return nil, 0, fmt.Errorf("failed to transfer coins: %w", err) + } + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) ClaimSpecific(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, readOnly bool) (ret []byte, remainingGas uint64, err error) { + claimMsg, sender, err := p.validate(ctx, caller, args, readOnly) + if err != nil { + return nil, 0, err + } + claimSpecificMsg, ok := claimMsg.(claimSpecificMsg) + if !ok { + return nil, 0, errors.New("message is not MsgClaimSpecific type") + } + callerSeiAddr := p.evmKeeper.GetSeiAddressOrDefault(ctx, caller) + for _, asset := range claimSpecificMsg.GetIAssets() { + if asset.IsNative() { + denom := asset.GetDenom() + balance := p.bankKeeper.GetBalance(ctx, sender, denom) + if !balance.IsZero() { + if err := p.bankKeeper.SendCoins(ctx, sender, callerSeiAddr, sdk.NewCoins(balance)); err != nil { + return nil, 0, err + } + } + continue + } + contractAddr, err := sdk.AccAddressFromBech32(asset.GetContractAddress()) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse contract address %s: %w", asset.GetContractAddress(), err) + } + switch { + case asset.IsCW20(): + res, err := p.wasmViewKeeper.QuerySmartSafe(ctx, contractAddr, CW20BalanceQueryPayload(sender)) + if err != nil { + return nil, 0, fmt.Errorf("failed to query CW20 contract %s for balance: %w", contractAddr.String(), err) + } + balance, err := ParseCW20BalanceQueryResponse(res) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse CW20 contract %s balance response: %w", contractAddr.String(), err) + } + _, err = p.wasmKeeper.Execute(ctx, contractAddr, sender, CW20TransferPayload(callerSeiAddr, balance), sdk.NewCoins()) + if err != nil { + return nil, 0, fmt.Errorf("failed to transfer on CW20 contract %s: %w", contractAddr.String(), err) + } + case asset.IsCW721(): + allTokens := []string{} + startAfter := "" + for { + res, err := p.wasmViewKeeper.QuerySmartSafe(ctx, contractAddr, CW721TokensQueryPayload(sender, startAfter)) + if err != nil { + return nil, 0, fmt.Errorf("failed to query CW721 contract %s for all tokens: %w", contractAddr.String(), err) + } + tokens, err := ParseCW721TokensQueryResponse(res) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse CW20 contract %s balance response: %w", contractAddr.String(), err) + } + if len(tokens) == 0 { + break + } + allTokens = append(allTokens, tokens...) + startAfter = tokens[len(tokens)-1] + } + for _, token := range allTokens { + _, err := p.wasmKeeper.Execute(ctx, contractAddr, sender, CW721TransferPayload(callerSeiAddr, token), sdk.NewCoins()) + if err != nil { + return nil, 0, fmt.Errorf("failed to transfer token %s on CW721 contract %s: %w", token, contractAddr.String(), err) + } + } + } + } + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) validate(ctx sdk.Context, caller common.Address, args []interface{}, readOnly bool) (claimMsg, sdk.AccAddress, error) { + if readOnly { + return nil, nil, errors.New("cannot call send from staticcall") + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, nil, err + } + tx, err := p.txConfig.TxDecoder()(args[0].([]byte)) + if err != nil { + return nil, nil, fmt.Errorf("failed to decode claim tx due to %w", err) + } + if len(tx.GetMsgs()) != 1 { + return nil, nil, fmt.Errorf("claim tx must contain exactly 1 message but %d were found", len(tx.GetMsgs())) + } + claimMsg, ok := tx.GetMsgs()[0].(claimMsg) + if !ok { + return nil, nil, errors.New("claim tx can only contain MsgClaim or MsgClaimSpecific type") + } + if common.HexToAddress(claimMsg.GetClaimer()).Cmp(caller) != 0 { + return nil, nil, fmt.Errorf("claim tx is meant for %s but was sent by %s", claimMsg.GetClaimer(), caller.Hex()) + } + sender, err := sdk.AccAddressFromBech32(claimMsg.GetSender()) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse claim tx sender due to %s", err) + } + if err := p.sigverify(ctx, tx, claimMsg, sender); err != nil { + return nil, nil, err + } + return claimMsg, sender, nil +} + +func (p PrecompileExecutor) sigverify(ctx sdk.Context, tx sdk.Tx, claimMsg claimMsg, sender sdk.AccAddress) error { + sigTx, ok := tx.(authsigning.SigVerifiableTx) + if !ok { + return errors.New("claim tx must be a SigVerifiableTx") + } + var pubkey cryptotypes.PubKey + pubkeys, err := sigTx.GetPubKeys() + acct := p.accountKeeper.GetAccount(ctx, sender) + if acct == nil { + return fmt.Errorf("account %s does not exist", claimMsg.GetSender()) + } + if err == nil { + if len(pubkeys) != 1 { + return fmt.Errorf("claim tx can be signed by exactly 1 key but %d signed", len(pubkeys)) + } + pubkey = pubkeys[0] + } else { + // try find pubkey from storage + pubkey = acct.GetPubKey() + if pubkey == nil { + return errors.New("must provide pubkey from accounts that have never sent transactions") + } + } + pubkeyAddr := sdk.AccAddress(pubkey.Address()) + if !bytes.Equal(pubkeyAddr, sender) { + return fmt.Errorf("claim message is for %s but was signed by %s", sender.String(), pubkeyAddr.String()) + } + sigs, err := sigTx.GetSignaturesV2() + if err != nil { + return fmt.Errorf("failed to get signatures due to %w", err) + } + if len(sigs) != 1 { + return fmt.Errorf("claim tx should have exactly 1 signature but got %d", len(sigs)) + } + sig := sigs[0] + if sig.Sequence != acct.GetSequence() { + return fmt.Errorf("account sequence mismatch for claim tx (%d vs. %d)", sig.Sequence, acct.GetSequence()) + } + if err := authante.DefaultSigVerificationGasConsumer(ctx.GasMeter(), sig, p.accountKeeper.GetParams(ctx)); err != nil { + return fmt.Errorf("insufficient gas for sig verification: %w", err) + } + signerData := authsigning.SignerData{ + ChainID: ctx.ChainID(), + AccountNumber: acct.GetAccountNumber(), + Sequence: acct.GetSequence(), + } + if err := authsigning.VerifySignature(pubkey, signerData, sig.Data, p.txConfig.SignModeHandler(), tx); err != nil { + return fmt.Errorf("failed to verify signature for claim tx: %w", err) + } + // increment sequence + _ = acct.SetSequence(acct.GetSequence() + 1) + p.accountKeeper.SetAccount(ctx, acct) + return nil +} + +func CW20BalanceQueryPayload(addr sdk.AccAddress) []byte { + raw := map[string]interface{}{"address": addr.String()} + bz, err := json.Marshal(map[string]interface{}{"balance": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func ParseCW20BalanceQueryResponse(res []byte) (sdk.Int, error) { + type response struct { + Balance sdk.Int `json:"balance"` + } + typed := response{} + if err := json.Unmarshal(res, &typed); err != nil { + return sdk.Int{}, err + } + return typed.Balance, nil +} + +func CW20TransferPayload(recipient sdk.AccAddress, amount sdk.Int) []byte { + type request struct { + Recipient string `json:"recipient"` + Amount sdk.Int `json:"amount"` + } + raw := request{Recipient: recipient.String(), Amount: amount} + bz, err := json.Marshal(map[string]interface{}{"transfer": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func CW721TokensQueryPayload(addr sdk.AccAddress, startAfter string) []byte { + raw := map[string]interface{}{"owner": addr.String()} + if startAfter != "" { + raw["start_after"] = startAfter + } + bz, err := json.Marshal(map[string]interface{}{"tokens": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func ParseCW721TokensQueryResponse(res []byte) ([]string, error) { + type response struct { + Tokens []string `json:"tokens"` + } + typed := response{} + if err := json.Unmarshal(res, &typed); err != nil { + return []string{}, err + } + return typed.Tokens, nil +} + +func CW721TransferPayload(recipient sdk.AccAddress, token string) []byte { + type request struct { + Recipient string `json:"recipient"` + Token string `json:"token_id"` + } + raw := request{Recipient: recipient.String(), Token: token} + bz, err := json.Marshal(map[string]interface{}{"transfer_nft": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} diff --git a/precompiles/solo/legacy/v630/abi.json b/precompiles/solo/legacy/v630/abi.json new file mode 100644 index 0000000000..37adc6f0e6 --- /dev/null +++ b/precompiles/solo/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"claim","outputs":[{"internalType":"bool","name":"response","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"claimSpecific","outputs":[{"internalType":"bool","name":"response","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/precompiles/solo/legacy/v630/solo.go b/precompiles/solo/legacy/v630/solo.go new file mode 100644 index 0000000000..ae4612bf57 --- /dev/null +++ b/precompiles/solo/legacy/v630/solo.go @@ -0,0 +1,387 @@ +package v630 + +import ( + "bytes" + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + authante "github.com/cosmos/cosmos-sdk/x/auth/ante" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + putils "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/utils" +) + +const ( + ClaimMethod = "claim" + ClaimSpecificMethod = "claimSpecific" +) + +const SoloAddress = "0x000000000000000000000000000000000000100C" + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var F embed.FS + +type PrecompileExecutor struct { + evmKeeper putils.EVMKeeper + bankKeeper putils.BankKeeper + accountKeeper putils.AccountKeeper + wasmKeeper putils.WasmdKeeper + wasmViewKeeper putils.WasmdViewKeeper + + txConfig client.TxConfig + + ClaimMethodID []byte + ClaimSpecificMethodID []byte +} + +func NewPrecompile( + keepers putils.Keepers, +) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(F, "abi.json") + + return pcommon.NewDynamicGasPrecompile( + newAbi, NewExecutor(newAbi, keepers.EVMK(), keepers.BankK(), keepers.AccountK(), keepers.WasmdK(), keepers.WasmdVK(), keepers.TxConfig()), + common.HexToAddress(SoloAddress), "solo"), nil +} + +func NewExecutor( + a abi.ABI, + evmKeeper putils.EVMKeeper, + bankKeeper putils.BankKeeper, + accountKeeper putils.AccountKeeper, + wasmKeeper putils.WasmdKeeper, + wasmViewKeeper putils.WasmdViewKeeper, + txConfig client.TxConfig, +) *PrecompileExecutor { + p := &PrecompileExecutor{ + evmKeeper: evmKeeper, + bankKeeper: bankKeeper, + accountKeeper: accountKeeper, + wasmKeeper: wasmKeeper, + wasmViewKeeper: wasmViewKeeper, + txConfig: txConfig, + } + + for name, m := range a.Methods { + switch name { + case ClaimMethod: + p.ClaimMethodID = m.ID + case ClaimSpecificMethod: + p.ClaimSpecificMethodID = m.ID + } + } + return p +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, _ *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + // Needed to catch gas meter panics + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("execution reverted: %v", r) + ret = nil + remainingGas = 0 + return + } + }() + if !ctx.IsEVM() { + return nil, 0, errors.New("cannot claim from a CW call") + } + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + if !ctx.IsEVM() || ctx.EVMEntryViaWasmdPrecompile() { + return nil, 0, errors.New("cannot claim from cosmos entry") + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall claim") + } + // depth is incremented upon entering the precompile call so it's + // expected to be 1. + if evm.GetDepth() > 1 { + return nil, 0, errors.New("claim must be called by an EOA directly") + } + switch method.Name { + case ClaimMethod: + return p.Claim(ctx, caller, method, args, readOnly) + case ClaimSpecificMethod: + return p.ClaimSpecific(ctx, caller, method, args, readOnly) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() putils.EVMKeeper { + return p.evmKeeper +} + +type claimMsg interface { + GetClaimer() string + GetSender() string +} + +type claimSpecificMsg interface { + claimMsg + GetIAssets() []utils.IAsset +} + +func (p PrecompileExecutor) Claim(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, readOnly bool) (ret []byte, remainingGas uint64, err error) { + claimMsg, sender, err := p.validate(ctx, caller, args, readOnly) + if err != nil { + return nil, 0, err + } + _, ok := claimMsg.(claimSpecificMsg) + if ok { + return nil, 0, errors.New("message for Claim must not be MsgClaimSpecific type") + } + if err := p.bankKeeper.SendCoins(ctx, sender, + p.evmKeeper.GetSeiAddressOrDefault(ctx, caller), p.bankKeeper.GetAllBalances(ctx, sender)); err != nil { + return nil, 0, fmt.Errorf("failed to transfer coins: %w", err) + } + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) ClaimSpecific(ctx sdk.Context, caller common.Address, method *abi.Method, args []interface{}, readOnly bool) (ret []byte, remainingGas uint64, err error) { + claimMsg, sender, err := p.validate(ctx, caller, args, readOnly) + if err != nil { + return nil, 0, err + } + claimSpecificMsg, ok := claimMsg.(claimSpecificMsg) + if !ok { + return nil, 0, errors.New("message is not MsgClaimSpecific type") + } + callerSeiAddr := p.evmKeeper.GetSeiAddressOrDefault(ctx, caller) + for _, asset := range claimSpecificMsg.GetIAssets() { + if asset.IsNative() { + denom := asset.GetDenom() + balance := p.bankKeeper.GetBalance(ctx, sender, denom) + if !balance.IsZero() { + if err := p.bankKeeper.SendCoins(ctx, sender, callerSeiAddr, sdk.NewCoins(balance)); err != nil { + return nil, 0, err + } + } + continue + } + contractAddr, err := sdk.AccAddressFromBech32(asset.GetContractAddress()) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse contract address %s: %w", asset.GetContractAddress(), err) + } + switch { + case asset.IsCW20(): + res, err := p.wasmViewKeeper.QuerySmartSafe(ctx, contractAddr, CW20BalanceQueryPayload(sender)) + if err != nil { + return nil, 0, fmt.Errorf("failed to query CW20 contract %s for balance: %w", contractAddr.String(), err) + } + balance, err := ParseCW20BalanceQueryResponse(res) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse CW20 contract %s balance response: %w", contractAddr.String(), err) + } + _, err = p.wasmKeeper.Execute(ctx, contractAddr, sender, CW20TransferPayload(callerSeiAddr, balance), sdk.NewCoins()) + if err != nil { + return nil, 0, fmt.Errorf("failed to transfer on CW20 contract %s: %w", contractAddr.String(), err) + } + case asset.IsCW721(): + allTokens := []string{} + if token := asset.GetDenom(); token != "" { + allTokens = append(allTokens, token) + } else { + startAfter := "" + for { + res, err := p.wasmViewKeeper.QuerySmartSafe(ctx, contractAddr, CW721TokensQueryPayload(sender, startAfter)) + if err != nil { + return nil, 0, fmt.Errorf("failed to query CW721 contract %s for all tokens: %w", contractAddr.String(), err) + } + tokens, err := ParseCW721TokensQueryResponse(res) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse CW20 contract %s balance response: %w", contractAddr.String(), err) + } + if len(tokens) == 0 { + break + } + allTokens = append(allTokens, tokens...) + startAfter = tokens[len(tokens)-1] + } + } + for _, token := range allTokens { + _, err := p.wasmKeeper.Execute(ctx, contractAddr, sender, CW721TransferPayload(callerSeiAddr, token), sdk.NewCoins()) + if err != nil { + return nil, 0, fmt.Errorf("failed to transfer token %s on CW721 contract %s: %w", token, contractAddr.String(), err) + } + } + } + } + bz, err := method.Outputs.Pack(true) + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), err +} + +func (p PrecompileExecutor) validate(ctx sdk.Context, caller common.Address, args []interface{}, readOnly bool) (claimMsg, sdk.AccAddress, error) { + if readOnly { + return nil, nil, errors.New("cannot call send from staticcall") + } + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, nil, err + } + tx, err := p.txConfig.TxDecoder()(args[0].([]byte)) + if err != nil { + return nil, nil, fmt.Errorf("failed to decode claim tx due to %w", err) + } + if len(tx.GetMsgs()) != 1 { + return nil, nil, fmt.Errorf("claim tx must contain exactly 1 message but %d were found", len(tx.GetMsgs())) + } + claimMsg, ok := tx.GetMsgs()[0].(claimMsg) + if !ok { + return nil, nil, errors.New("claim tx can only contain MsgClaim or MsgClaimSpecific type") + } + if common.HexToAddress(claimMsg.GetClaimer()).Cmp(caller) != 0 { + return nil, nil, fmt.Errorf("claim tx is meant for %s but was sent by %s", claimMsg.GetClaimer(), caller.Hex()) + } + sender, err := sdk.AccAddressFromBech32(claimMsg.GetSender()) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse claim tx sender due to %s", err) + } + if err := p.sigverify(ctx, tx, claimMsg, sender); err != nil { + return nil, nil, err + } + return claimMsg, sender, nil +} + +func (p PrecompileExecutor) sigverify(ctx sdk.Context, tx sdk.Tx, claimMsg claimMsg, sender sdk.AccAddress) error { + sigTx, ok := tx.(authsigning.SigVerifiableTx) + if !ok { + return errors.New("claim tx must be a SigVerifiableTx") + } + var pubkey cryptotypes.PubKey + pubkeys, err := sigTx.GetPubKeys() + acct := p.accountKeeper.GetAccount(ctx, sender) + if acct == nil { + return fmt.Errorf("account %s does not exist", claimMsg.GetSender()) + } + if err == nil { + if len(pubkeys) != 1 { + return fmt.Errorf("claim tx can be signed by exactly 1 key but %d signed", len(pubkeys)) + } + pubkey = pubkeys[0] + } else { + // try find pubkey from storage + pubkey = acct.GetPubKey() + if pubkey == nil { + return errors.New("must provide pubkey from accounts that have never sent transactions") + } + } + pubkeyAddr := sdk.AccAddress(pubkey.Address()) + if !bytes.Equal(pubkeyAddr, sender) { + return fmt.Errorf("claim message is for %s but was signed by %s", sender.String(), pubkeyAddr.String()) + } + sigs, err := sigTx.GetSignaturesV2() + if err != nil { + return fmt.Errorf("failed to get signatures due to %w", err) + } + if len(sigs) != 1 { + return fmt.Errorf("claim tx should have exactly 1 signature but got %d", len(sigs)) + } + sig := sigs[0] + if sig.Sequence != acct.GetSequence() { + return fmt.Errorf("account sequence mismatch for claim tx (%d vs. %d)", sig.Sequence, acct.GetSequence()) + } + if err := authante.DefaultSigVerificationGasConsumer(ctx.GasMeter(), sig, p.accountKeeper.GetParams(ctx)); err != nil { + return fmt.Errorf("insufficient gas for sig verification: %w", err) + } + signerData := authsigning.SignerData{ + ChainID: ctx.ChainID(), + AccountNumber: acct.GetAccountNumber(), + Sequence: acct.GetSequence(), + } + if err := authsigning.VerifySignature(pubkey, signerData, sig.Data, p.txConfig.SignModeHandler(), tx); err != nil { + return fmt.Errorf("failed to verify signature for claim tx: %w", err) + } + // increment sequence + _ = acct.SetSequence(acct.GetSequence() + 1) + p.accountKeeper.SetAccount(ctx, acct) + return nil +} + +func CW20BalanceQueryPayload(addr sdk.AccAddress) []byte { + raw := map[string]interface{}{"address": addr.String()} + bz, err := json.Marshal(map[string]interface{}{"balance": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func ParseCW20BalanceQueryResponse(res []byte) (sdk.Int, error) { + type response struct { + Balance sdk.Int `json:"balance"` + } + typed := response{} + if err := json.Unmarshal(res, &typed); err != nil { + return sdk.Int{}, err + } + return typed.Balance, nil +} + +func CW20TransferPayload(recipient sdk.AccAddress, amount sdk.Int) []byte { + type request struct { + Recipient string `json:"recipient"` + Amount sdk.Int `json:"amount"` + } + raw := request{Recipient: recipient.String(), Amount: amount} + bz, err := json.Marshal(map[string]interface{}{"transfer": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func CW721TokensQueryPayload(addr sdk.AccAddress, startAfter string) []byte { + raw := map[string]interface{}{"owner": addr.String()} + if startAfter != "" { + raw["start_after"] = startAfter + } + bz, err := json.Marshal(map[string]interface{}{"tokens": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} + +func ParseCW721TokensQueryResponse(res []byte) ([]string, error) { + type response struct { + Tokens []string `json:"tokens"` + } + typed := response{} + if err := json.Unmarshal(res, &typed); err != nil { + return []string{}, err + } + return typed.Tokens, nil +} + +func CW721TransferPayload(recipient sdk.AccAddress, token string) []byte { + type request struct { + Recipient string `json:"recipient"` + Token string `json:"token_id"` + } + raw := request{Recipient: recipient.String(), Token: token} + bz, err := json.Marshal(map[string]interface{}{"transfer_nft": raw}) + if err != nil { + // should be impossible + panic(err) + } + return bz +} diff --git a/precompiles/solo/setup.go b/precompiles/solo/setup.go index 427a16826b..d6de06e71b 100644 --- a/precompiles/solo/setup.go +++ b/precompiles/solo/setup.go @@ -2,12 +2,16 @@ package solo import ( "github.com/ethereum/go-ethereum/core/vm" + solov614 "github.com/sei-protocol/sei-chain/precompiles/solo/legacy/v614" + solov620 "github.com/sei-protocol/sei-chain/precompiles/solo/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPrecompiles { return utils.VersionedPrecompiles{ latestUpgrade: check(NewPrecompile(keepers)), + "v6.1.4": check(solov614.NewPrecompile(keepers)), + "v6.2.0": check(solov620.NewPrecompile(keepers)), } } diff --git a/precompiles/solo/solo_test.go b/precompiles/solo/solo_test.go index 81f64ccfd4..14f6f9c837 100644 --- a/precompiles/solo/solo_test.go +++ b/precompiles/solo/solo_test.go @@ -207,7 +207,7 @@ func TestClaimSingleCW721(t *testing.T) { _, remainingGas, err := p.ClaimSpecific(ctx, claimer, &method, []interface{}{signClaimMsg(t, evmtypes.NewMsgClaimSpecific(claimee, claimer, &evmtypes.Asset{AssetType: evmtypes.AssetType_TYPECW721, ContractAddress: contractAddr.String(), Denom: "5"}), claimee, claimer, acc, claimeeKey)}, false) ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) require.NoError(t, err) - require.Equal(t, uint64(1838040), remainingGas) + require.Equal(t, uint64(0x1c0bc6), remainingGas) for i := 0; i < 15; i++ { if i == 5 { require.Equal(t, k.GetSeiAddressOrDefault(ctx, claimer).String(), queryCW721Owner(ctx, testkeeper.EVMTestApp.WasmKeeper, contractAddr, fmt.Sprintf("%d", i))) diff --git a/precompiles/solo/versions b/precompiles/solo/versions index dc2fce17b2..23ba883bf2 100644 --- a/precompiles/solo/versions +++ b/precompiles/solo/versions @@ -1 +1,3 @@ v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/staking/Staking.sol b/precompiles/staking/Staking.sol index f698c704e1..1e1ef5b140 100644 --- a/precompiles/staking/Staking.sol +++ b/precompiles/staking/Staking.sol @@ -151,6 +151,133 @@ interface IStaking { string memory valAddress ) external view returns (Delegation memory delegation); + function validators( + string memory status, + bytes memory nextKey + ) external view returns (ValidatorsResponse memory response); + + /** + * @notice Get validator information for a given validator address + * @param validatorAddress The validator address + * @return validator Validator details + */ + function validator( + string memory validatorAddress + ) external view returns (Validator memory validator); + + /** + * @notice Get delegations for a validator + * @param validatorAddress The validator address + * @param nextKey Pagination key + * @return response Delegations response with pagination + */ + function validatorDelegations( + string memory validatorAddress, + bytes memory nextKey + ) external view returns (DelegationsResponse memory response); + + /** + * @notice Get unbonding delegations for a validator + * @param validatorAddress The validator address + * @param nextKey Pagination key + * @return response Unbonding delegations response with pagination + */ + function validatorUnbondingDelegations( + string memory validatorAddress, + bytes memory nextKey + ) external view returns (UnbondingDelegationsResponse memory response); + + /** + * @notice Get unbonding delegation information for a delegator and validator pair + * @param delegator The delegator's address + * @param validatorAddress The validator address + * @return unbondingDelegation Unbonding delegation details + */ + function unbondingDelegation( + address delegator, + string memory validatorAddress + ) external view returns (UnbondingDelegation memory unbondingDelegation); + + /** + * @notice Get all delegations for a delegator + * @param delegator The delegator's address + * @param nextKey Pagination key + * @return response Delegations response with pagination + */ + function delegatorDelegations( + address delegator, + bytes memory nextKey + ) external view returns (DelegationsResponse memory response); + + /** + * @notice Get validator information for a delegator and validator pair + * @param delegator The delegator's address + * @param validatorAddress The validator address + * @return validator Validator details + */ + function delegatorValidator( + address delegator, + string memory validatorAddress + ) external view returns (Validator memory validator); + + /** + * @notice Get all unbonding delegations for a delegator + * @param delegator The delegator's address + * @param nextKey Pagination key + * @return response Unbonding delegations response with pagination + */ + function delegatorUnbondingDelegations( + address delegator, + bytes memory nextKey + ) external view returns (UnbondingDelegationsResponse memory response); + + /** + * @notice Get redelegations + * @param delegator The delegator's address (empty string for all) + * @param srcValidator The source validator address (empty string for all) + * @param dstValidator The destination validator address (empty string for all) + * @param nextKey Pagination key + * @return response Redelegations response with pagination + */ + function redelegations( + string memory delegator, + string memory srcValidator, + string memory dstValidator, + bytes memory nextKey + ) external view returns (RedelegationsResponse memory response); + + /** + * @notice Get all validators for a delegator + * @param delegator The delegator's address + * @param nextKey Pagination key + * @return response Validators response with pagination + */ + function delegatorValidators( + address delegator, + bytes memory nextKey + ) external view returns (ValidatorsResponse memory response); + + /** + * @notice Get historical info for a given height + * @param height The block height + * @return historicalInfo Historical info + */ + function historicalInfo( + int64 height + ) external view returns (HistoricalInfo memory historicalInfo); + + /** + * @notice Get pool information + * @return pool Pool details + */ + function pool() external view returns (Pool memory pool); + + /** + * @notice Get staking parameters + * @return params Staking parameters + */ + function params() external view returns (Params memory params); + struct Delegation { Balance balance; DelegationDetails delegation; @@ -167,4 +294,89 @@ interface IStaking { uint256 decimals; string validator_address; } + + struct Validator { + string operatorAddress; + bytes consensusPubkey; + bool jailed; + int32 status; + string tokens; + string delegatorShares; + string description; + int64 unbondingHeight; + int64 unbondingTime; + string commissionRate; + string commissionMaxRate; + string commissionMaxChangeRate; + int64 commissionUpdateTime; + string minSelfDelegation; + } + + struct ValidatorsResponse { + Validator[] validators; + bytes nextKey; + } + + struct DelegationsResponse { + Delegation[] delegations; + bytes nextKey; + } + + struct UnbondingDelegationEntry { + int64 creationHeight; + int64 completionTime; + string initialBalance; + string balance; + } + + struct UnbondingDelegation { + string delegatorAddress; + string validatorAddress; + UnbondingDelegationEntry[] entries; + } + + struct UnbondingDelegationsResponse { + UnbondingDelegation[] unbondingDelegations; + bytes nextKey; + } + + struct RedelegationEntry { + int64 creationHeight; + int64 completionTime; + string initialBalance; + string sharesDst; + } + + struct Redelegation { + string delegatorAddress; + string validatorSrcAddress; + string validatorDstAddress; + RedelegationEntry[] entries; + } + + struct RedelegationsResponse { + Redelegation[] redelegations; + bytes nextKey; + } + + struct HistoricalInfo { + int64 height; + Validator[] validators; + } + + struct Pool { + string notBondedTokens; + string bondedTokens; + } + + struct Params { + uint64 unbondingTime; + uint32 maxValidators; + uint32 maxEntries; + uint32 historicalEntries; + string bondDenom; + string minCommissionRate; + string maxVotingPowerRatio; + string maxVotingPowerEnforcementThreshold; + } } diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index 8778d7d683..59e796a4e4 100755 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -1,262 +1 @@ -[ - { - "inputs": [ - { "internalType": "string", "name": "valAddress", "type": "string" } - ], - "name": "delegate", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "srcAddress", "type": "string" }, - { "internalType": "string", "name": "dstAddress", "type": "string" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "redelegate", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "valAddress", "type": "string" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "undelegate", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "pubKeyHex", "type": "string" }, - { "internalType": "string", "name": "moniker", "type": "string" }, - { "internalType": "string", "name": "commissionRate", "type": "string" }, - { - "internalType": "string", - "name": "commissionMaxRate", - "type": "string" - }, - { - "internalType": "string", - "name": "commissionMaxChangeRate", - "type": "string" - }, - { - "internalType": "uint256", - "name": "minSelfDelegation", - "type": "uint256" - } - ], - "name": "createValidator", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "moniker", "type": "string" }, - { "internalType": "string", "name": "commissionRate", "type": "string" }, - { - "internalType": "uint256", - "name": "minSelfDelegation", - "type": "uint256" - } - ], - "name": "editValidator", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "delegator", "type": "address" }, - { "internalType": "string", "name": "valAddress", "type": "string" } - ], - "name": "delegation", - "outputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { "internalType": "string", "name": "denom", "type": "string" } - ], - "internalType": "struct Balance", - "name": "balance", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "string", - "name": "delegator_address", - "type": "string" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "decimals", - "type": "uint256" - }, - { - "internalType": "string", - "name": "validator_address", - "type": "string" - } - ], - "internalType": "struct DelegationDetails", - "name": "delegation", - "type": "tuple" - } - ], - "internalType": "struct Delegation", - "name": "delegation", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "validator", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Delegate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "srcValidator", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "dstValidator", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Redelegate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "validator", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Undelegate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "creator", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "moniker", - "type": "string" - } - ], - "name": "ValidatorCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "editor", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "validatorAddress", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "moniker", - "type": "string" - } - ], - "name": "ValidatorEdited", - "type": "event" - } -] +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Delegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"srcValidator","type":"string"},{"indexed":false,"internalType":"string","name":"dstValidator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Undelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"validatorAddress","type":"string"},{"indexed":false,"internalType":"string","name":"moniker","type":"string"}],"name":"ValidatorCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"editor","type":"address"},{"indexed":false,"internalType":"string","name":"validatorAddress","type":"string"},{"indexed":false,"internalType":"string","name":"moniker","type":"string"}],"name":"ValidatorEdited","type":"event"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"},{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"createValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegation","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation","name":"delegation","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorDelegations","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation[]","name":"delegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.DelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorUnbondingDelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation[]","name":"unbondingDelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.UnbondingDelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"delegatorValidator","outputs":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator","name":"validator","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorValidators","outputs":[{"components":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.ValidatorsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"editValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"height","type":"int64"}],"name":"historicalInfo","outputs":[{"components":[{"internalType":"int64","name":"height","type":"int64"},{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"}],"internalType":"struct IStaking.HistoricalInfo","name":"historicalInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"params","outputs":[{"components":[{"internalType":"uint64","name":"unbondingTime","type":"uint64"},{"internalType":"uint32","name":"maxValidators","type":"uint32"},{"internalType":"uint32","name":"maxEntries","type":"uint32"},{"internalType":"uint32","name":"historicalEntries","type":"uint32"},{"internalType":"string","name":"bondDenom","type":"string"},{"internalType":"string","name":"minCommissionRate","type":"string"},{"internalType":"string","name":"maxVotingPowerRatio","type":"string"},{"internalType":"string","name":"maxVotingPowerEnforcementThreshold","type":"string"}],"internalType":"struct IStaking.Params","name":"params","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"components":[{"internalType":"string","name":"notBondedTokens","type":"string"},{"internalType":"string","name":"bondedTokens","type":"string"}],"internalType":"struct IStaking.Pool","name":"pool","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"srcAddress","type":"string"},{"internalType":"string","name":"dstAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"delegator","type":"string"},{"internalType":"string","name":"srcValidator","type":"string"},{"internalType":"string","name":"dstValidator","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"redelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorSrcAddress","type":"string"},{"internalType":"string","name":"validatorDstAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"sharesDst","type":"string"}],"internalType":"struct IStaking.RedelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.Redelegation[]","name":"redelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.RedelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"unbondingDelegation","outputs":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation","name":"unbondingDelegation","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"valAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"undelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"validator","outputs":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator","name":"validator","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validatorDelegations","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation[]","name":"delegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.DelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validatorUnbondingDelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation[]","name":"unbondingDelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.UnbondingDelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"status","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validators","outputs":[{"components":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.ValidatorsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/staking/legacy/v620/abi.json b/precompiles/staking/legacy/v620/abi.json new file mode 100755 index 0000000000..a94ad5733c --- /dev/null +++ b/precompiles/staking/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"srcAddress","type":"string"},{"internalType":"string","name":"dstAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"valAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"undelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"},{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"createValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"editValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegation","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct Delegation","name":"delegation","type":"tuple"}],"stateMutability":"view","type":"function"}] diff --git a/precompiles/staking/legacy/v620/staking.go b/precompiles/staking/legacy/v620/staking.go new file mode 100644 index 0000000000..09d752c931 --- /dev/null +++ b/precompiles/staking/legacy/v620/staking.go @@ -0,0 +1,426 @@ +package v620 + +import ( + "bytes" + "embed" + "encoding/hex" + "errors" + "math/big" + + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + DelegateMethod = "delegate" + RedelegateMethod = "redelegate" + UndelegateMethod = "undelegate" + DelegationMethod = "delegation" + CreateValidatorMethod = "createValidator" + EditValidatorMethod = "editValidator" +) + +const ( + StakingAddress = "0x0000000000000000000000000000000000001005" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + stakingKeeper utils.StakingKeeper + stakingQuerier utils.StakingQuerier + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + address common.Address + + DelegateID []byte + RedelegateID []byte + UndelegateID []byte + DelegationID []byte + CreateValidatorID []byte + EditValidatorID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + stakingKeeper: keepers.StakingK(), + stakingQuerier: keepers.StakingQ(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: common.HexToAddress(StakingAddress), + } + + for name, m := range newAbi.Methods { + switch name { + case DelegateMethod: + p.DelegateID = m.ID + case RedelegateMethod: + p.RedelegateID = m.ID + case UndelegateMethod: + p.UndelegateID = m.ID + case DelegationMethod: + p.DelegationID = m.ID + case CreateValidatorMethod: + p.CreateValidatorID = m.ID + case EditValidatorMethod: + p.EditValidatorID = m.ID + } + } + + return pcommon.NewPrecompile(newAbi, p, p.address, "staking"), nil +} + +// RequiredGas returns the required bare minimum gas to execute the precompile. +func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { + if bytes.Equal(method.ID, p.DelegateID) { + return 50000 + } else if bytes.Equal(method.ID, p.RedelegateID) { + return 70000 + } else if bytes.Equal(method.ID, p.UndelegateID) { + return 50000 + } else if bytes.Equal(method.ID, p.CreateValidatorID) { + return 100000 + } else if bytes.Equal(method.ID, p.EditValidatorID) { + return 100000 + } + + // This should never happen since this is going to fail during Run + return pcommon.UnknownMethodCallGas +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, errors.New("cannot delegatecall staking") + } + switch method.Name { + case DelegateMethod: + if readOnly { + return nil, errors.New("cannot call staking precompile from staticcall") + } + return p.delegate(ctx, method, caller, args, value, hooks, evm) + case RedelegateMethod: + if readOnly { + return nil, errors.New("cannot call staking precompile from staticcall") + } + return p.redelegate(ctx, method, caller, args, value) + case UndelegateMethod: + if readOnly { + return nil, errors.New("cannot call staking precompile from staticcall") + } + return p.undelegate(ctx, method, caller, args, value) + case CreateValidatorMethod: + if readOnly { + return nil, errors.New("cannot call staking precompile from staticcall") + } + return p.createValidator(ctx, method, caller, args, value, hooks, evm) + case EditValidatorMethod: + if readOnly { + return nil, errors.New("cannot call staking precompile from staticcall") + } + return p.editValidator(ctx, method, caller, args, value, hooks, evm) + case DelegationMethod: + return p.delegation(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, err + } + // if delegator is associated, then it must have Account set already + // if delegator is not associated, then it can't delegate anyway (since + // there is no good way to merge delegations if it becomes associated) + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + validatorBech32 := args[0].(string) + if value == nil || value.Sign() == 0 { + return nil, errors.New("set `value` field to non-zero to send delegate fund") + } + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), delegator, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, err + } + _, err = p.stakingKeeper.Delegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgDelegate{ + DelegatorAddress: delegator.String(), + ValidatorAddress: validatorBech32, + Amount: coin, + }) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + return nil, err + } + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + srcValidatorBech32 := args[0].(string) + dstValidatorBech32 := args[1].(string) + amount := args[2].(*big.Int) + _, err := p.stakingKeeper.BeginRedelegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgBeginRedelegate{ + DelegatorAddress: delegator.String(), + ValidatorSrcAddress: srcValidatorBech32, + ValidatorDstAddress: dstValidatorBech32, + Amount: sdk.NewCoin(sdk.MustGetBaseDenom(), sdk.NewIntFromBigInt(amount)), + }) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + validatorBech32 := args[0].(string) + amount := args[1].(*big.Int) + _, err := p.stakingKeeper.Undelegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgUndelegate{ + DelegatorAddress: delegator.String(), + ValidatorAddress: validatorBech32, + Amount: sdk.NewCoin(p.evmKeeper.GetBaseDenom(ctx), sdk.NewIntFromBigInt(amount)), + }) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) +} + +type Delegation struct { + Balance Balance + Delegation DelegationDetails +} + +type Balance struct { + Amount *big.Int + Denom string +} + +type DelegationDetails struct { + DelegatorAddress string + Shares *big.Int + Decimals *big.Int + ValidatorAddress string +} + +func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, err + } + + validatorBech32 := args[1].(string) + delegationRequest := &stakingtypes.QueryDelegationRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + delegationResponse, err := p.stakingQuerier.Delegation(sdk.WrapSDKContext(ctx), delegationRequest) + if err != nil { + return nil, err + } + + delegation := Delegation{ + Balance: Balance{ + Amount: delegationResponse.GetDelegationResponse().GetBalance().Amount.BigInt(), + Denom: delegationResponse.GetDelegationResponse().GetBalance().Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: delegationResponse.GetDelegationResponse().GetDelegation().DelegatorAddress, + Shares: delegationResponse.GetDelegationResponse().GetDelegation().Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: delegationResponse.GetDelegationResponse().GetDelegation().ValidatorAddress, + }, + } + + return method.Outputs.Pack(delegation) +} + +func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateArgsLength(args, 6); err != nil { + return nil, err + } + + // Extract arguments + pubKeyHex := args[0].(string) + moniker := args[1].(string) + commissionRateStr := args[2].(string) + commissionMaxRateStr := args[3].(string) + commissionMaxChangeRateStr := args[4].(string) + minSelfDelegation := args[5].(*big.Int) + + // Get validator address (caller's associated Sei address) + valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse public key from hex + pubKeyBytes, err := hex.DecodeString(pubKeyHex) + if err != nil { + return nil, errors.New("invalid public key hex format") + } + + // Create ed25519 public key + pubKey := &ed25519.PubKey{Key: pubKeyBytes} + + // Parse commission rates + commissionRate, err := sdk.NewDecFromStr(commissionRateStr) + if err != nil { + return nil, errors.New("invalid commission rate") + } + + commissionMaxRate, err := sdk.NewDecFromStr(commissionMaxRateStr) + if err != nil { + return nil, errors.New("invalid commission max rate") + } + + commissionMaxChangeRate, err := sdk.NewDecFromStr(commissionMaxChangeRateStr) + if err != nil { + return nil, errors.New("invalid commission max change rate") + } + + commission := stakingtypes.NewCommissionRates(commissionRate, commissionMaxRate, commissionMaxChangeRate) + + if value == nil || value.Sign() == 0 { + return nil, errors.New("set `value` field to non-zero to send delegate fund") + } + + coin, err := pcommon.HandlePaymentUsei( + ctx, + p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), + valAddress, + value, + p.bankKeeper, + p.evmKeeper, + hooks, + evm.GetDepth()) + if err != nil { + return nil, err + } + + description := stakingtypes.Description{ + Moniker: moniker, + } + + msg, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(valAddress), pubKey, coin, description, commission, sdk.NewIntFromBigInt(minSelfDelegation)) + if err != nil { + return nil, err + } + + err = msg.ValidateBasic() + if err != nil { + return nil, err + } + + // Call the staking keeper + _, err = p.stakingKeeper.CreateValidator(sdk.WrapSDKContext(ctx), msg) + if err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} + +func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, err + } + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + return nil, err + } + + // Extract arguments + moniker := args[0].(string) + commissionRateStr := args[1].(string) + minSelfDelegation := args[2].(*big.Int) + + // Get validator address (caller's associated Sei address) + valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse commission rate - if empty string, don't change commission + var commissionRate *sdk.Dec + if commissionRateStr != "" { + rate, err := sdk.NewDecFromStr(commissionRateStr) + if err != nil { + return nil, errors.New("invalid commission rate") + } + commissionRate = &rate + } + // If commissionRateStr is empty, commissionRate remains nil + + // Parse minSelfDelegation - if 0, don't change it + var minSelfDelegationPtr *sdk.Int + if minSelfDelegation.Sign() > 0 { + minSelf := sdk.NewIntFromBigInt(minSelfDelegation) + minSelfDelegationPtr = &minSelf + } + // If minSelfDelegation is 0, minSelfDelegationPtr remains nil + + description := stakingtypes.Description{ + Moniker: moniker, + } + + msg := stakingtypes.NewMsgEditValidator( + sdk.ValAddress(valAddress), + description, + commissionRate, + minSelfDelegationPtr, + ) + + err := msg.ValidateBasic() + if err != nil { + return nil, err + } + + _, err = p.stakingKeeper.EditValidator(sdk.WrapSDKContext(ctx), msg) + if err != nil { + return nil, err + } + + return method.Outputs.Pack(true) +} diff --git a/precompiles/staking/legacy/v630/abi.json b/precompiles/staking/legacy/v630/abi.json new file mode 100755 index 0000000000..59e796a4e4 --- /dev/null +++ b/precompiles/staking/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Delegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"srcValidator","type":"string"},{"indexed":false,"internalType":"string","name":"dstValidator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Undelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"validatorAddress","type":"string"},{"indexed":false,"internalType":"string","name":"moniker","type":"string"}],"name":"ValidatorCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"editor","type":"address"},{"indexed":false,"internalType":"string","name":"validatorAddress","type":"string"},{"indexed":false,"internalType":"string","name":"moniker","type":"string"}],"name":"ValidatorEdited","type":"event"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"},{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"createValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"valAddress","type":"string"}],"name":"delegation","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation","name":"delegation","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorDelegations","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation[]","name":"delegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.DelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorUnbondingDelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation[]","name":"unbondingDelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.UnbondingDelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"delegatorValidator","outputs":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator","name":"validator","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"delegatorValidators","outputs":[{"components":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.ValidatorsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"moniker","type":"string"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"uint256","name":"minSelfDelegation","type":"uint256"}],"name":"editValidator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"height","type":"int64"}],"name":"historicalInfo","outputs":[{"components":[{"internalType":"int64","name":"height","type":"int64"},{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"}],"internalType":"struct IStaking.HistoricalInfo","name":"historicalInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"params","outputs":[{"components":[{"internalType":"uint64","name":"unbondingTime","type":"uint64"},{"internalType":"uint32","name":"maxValidators","type":"uint32"},{"internalType":"uint32","name":"maxEntries","type":"uint32"},{"internalType":"uint32","name":"historicalEntries","type":"uint32"},{"internalType":"string","name":"bondDenom","type":"string"},{"internalType":"string","name":"minCommissionRate","type":"string"},{"internalType":"string","name":"maxVotingPowerRatio","type":"string"},{"internalType":"string","name":"maxVotingPowerEnforcementThreshold","type":"string"}],"internalType":"struct IStaking.Params","name":"params","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"components":[{"internalType":"string","name":"notBondedTokens","type":"string"},{"internalType":"string","name":"bondedTokens","type":"string"}],"internalType":"struct IStaking.Pool","name":"pool","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"srcAddress","type":"string"},{"internalType":"string","name":"dstAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"delegator","type":"string"},{"internalType":"string","name":"srcValidator","type":"string"},{"internalType":"string","name":"dstValidator","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"redelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorSrcAddress","type":"string"},{"internalType":"string","name":"validatorDstAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"sharesDst","type":"string"}],"internalType":"struct IStaking.RedelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.Redelegation[]","name":"redelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.RedelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"unbondingDelegation","outputs":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation","name":"unbondingDelegation","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"valAddress","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"undelegate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"}],"name":"validator","outputs":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator","name":"validator","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validatorDelegations","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IStaking.Balance","name":"balance","type":"tuple"},{"components":[{"internalType":"string","name":"delegator_address","type":"string"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IStaking.DelegationDetails","name":"delegation","type":"tuple"}],"internalType":"struct IStaking.Delegation[]","name":"delegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.DelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"validatorAddress","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validatorUnbondingDelegations","outputs":[{"components":[{"components":[{"internalType":"string","name":"delegatorAddress","type":"string"},{"internalType":"string","name":"validatorAddress","type":"string"},{"components":[{"internalType":"int64","name":"creationHeight","type":"int64"},{"internalType":"int64","name":"completionTime","type":"int64"},{"internalType":"string","name":"initialBalance","type":"string"},{"internalType":"string","name":"balance","type":"string"}],"internalType":"struct IStaking.UnbondingDelegationEntry[]","name":"entries","type":"tuple[]"}],"internalType":"struct IStaking.UnbondingDelegation[]","name":"unbondingDelegations","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.UnbondingDelegationsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"status","type":"string"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"name":"validators","outputs":[{"components":[{"components":[{"internalType":"string","name":"operatorAddress","type":"string"},{"internalType":"bytes","name":"consensusPubkey","type":"bytes"},{"internalType":"bool","name":"jailed","type":"bool"},{"internalType":"int32","name":"status","type":"int32"},{"internalType":"string","name":"tokens","type":"string"},{"internalType":"string","name":"delegatorShares","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"int64","name":"unbondingHeight","type":"int64"},{"internalType":"int64","name":"unbondingTime","type":"int64"},{"internalType":"string","name":"commissionRate","type":"string"},{"internalType":"string","name":"commissionMaxRate","type":"string"},{"internalType":"string","name":"commissionMaxChangeRate","type":"string"},{"internalType":"int64","name":"commissionUpdateTime","type":"int64"},{"internalType":"string","name":"minSelfDelegation","type":"string"}],"internalType":"struct IStaking.Validator[]","name":"validators","type":"tuple[]"},{"internalType":"bytes","name":"nextKey","type":"bytes"}],"internalType":"struct IStaking.ValidatorsResponse","name":"response","type":"tuple"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/staking/legacy/v630/staking.go b/precompiles/staking/legacy/v630/staking.go new file mode 100644 index 0000000000..f9ba88ef8f --- /dev/null +++ b/precompiles/staking/legacy/v630/staking.go @@ -0,0 +1,1243 @@ +package v630 + +import ( + "embed" + "encoding/hex" + "errors" + "math/big" + + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + DelegateMethod = "delegate" + RedelegateMethod = "redelegate" + UndelegateMethod = "undelegate" + DelegationMethod = "delegation" + CreateValidatorMethod = "createValidator" + EditValidatorMethod = "editValidator" + ValidatorsMethod = "validators" + ValidatorMethod = "validator" + ValidatorDelegationsMethod = "validatorDelegations" + ValidatorUnbondingDelegationsMethod = "validatorUnbondingDelegations" + UnbondingDelegationMethod = "unbondingDelegation" + DelegatorDelegationsMethod = "delegatorDelegations" + DelegatorValidatorMethod = "delegatorValidator" + DelegatorUnbondingDelegationsMethod = "delegatorUnbondingDelegations" + RedelegationsMethod = "redelegations" + DelegatorValidatorsMethod = "delegatorValidators" + HistoricalInfoMethod = "historicalInfo" + PoolMethod = "pool" + ParamsMethod = "params" +) + +const ( + StakingAddress = "0x0000000000000000000000000000000000001005" +) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + stakingKeeper utils.StakingKeeper + stakingQuerier utils.StakingQuerier + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + address common.Address + + DelegateID []byte + RedelegateID []byte + UndelegateID []byte + DelegationID []byte + CreateValidatorID []byte + EditValidatorID []byte + ValidatorsID []byte + ValidatorID []byte + ValidatorDelegationsID []byte + ValidatorUnbondingDelegationsID []byte + UnbondingDelegationID []byte + DelegatorDelegationsID []byte + DelegatorValidatorID []byte + DelegatorUnbondingDelegationsID []byte + RedelegationsID []byte + DelegatorValidatorsID []byte + HistoricalInfoID []byte + PoolID []byte + ParamsID []byte +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := pcommon.MustGetABI(f, "abi.json") + + p := &PrecompileExecutor{ + stakingKeeper: keepers.StakingK(), + stakingQuerier: keepers.StakingQ(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: common.HexToAddress(StakingAddress), + } + + for name, m := range newAbi.Methods { + switch name { + case DelegateMethod: + p.DelegateID = m.ID + case RedelegateMethod: + p.RedelegateID = m.ID + case UndelegateMethod: + p.UndelegateID = m.ID + case DelegationMethod: + p.DelegationID = m.ID + case CreateValidatorMethod: + p.CreateValidatorID = m.ID + case EditValidatorMethod: + p.EditValidatorID = m.ID + case ValidatorsMethod: + p.ValidatorsID = m.ID + case ValidatorMethod: + p.ValidatorID = m.ID + case ValidatorDelegationsMethod: + p.ValidatorDelegationsID = m.ID + case ValidatorUnbondingDelegationsMethod: + p.ValidatorUnbondingDelegationsID = m.ID + case UnbondingDelegationMethod: + p.UnbondingDelegationID = m.ID + case DelegatorDelegationsMethod: + p.DelegatorDelegationsID = m.ID + case DelegatorValidatorMethod: + p.DelegatorValidatorID = m.ID + case DelegatorUnbondingDelegationsMethod: + p.DelegatorUnbondingDelegationsID = m.ID + case RedelegationsMethod: + p.RedelegationsID = m.ID + case DelegatorValidatorsMethod: + p.DelegatorValidatorsID = m.ID + case HistoricalInfoMethod: + p.HistoricalInfoID = m.ID + case PoolMethod: + p.PoolID = m.ID + case ParamsMethod: + p.ParamsID = m.ID + } + } + + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "staking"), nil +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if ctx.EVMPrecompileCalledFromDelegateCall() { + return nil, 0, errors.New("cannot delegatecall staking") + } + switch method.Name { + case DelegateMethod: + if readOnly { + return nil, 0, errors.New("cannot call staking precompile from staticcall") + } + return p.delegate(ctx, method, caller, args, value, hooks, evm) + case RedelegateMethod: + if readOnly { + return nil, 0, errors.New("cannot call staking precompile from staticcall") + } + return p.redelegate(ctx, method, caller, args, value, evm) + case UndelegateMethod: + if readOnly { + return nil, 0, errors.New("cannot call staking precompile from staticcall") + } + return p.undelegate(ctx, method, caller, args, value, evm) + case CreateValidatorMethod: + if readOnly { + return nil, 0, errors.New("cannot call staking precompile from staticcall") + } + return p.createValidator(ctx, method, caller, args, value, hooks, evm) + case EditValidatorMethod: + if readOnly { + return nil, 0, errors.New("cannot call staking precompile from staticcall") + } + return p.editValidator(ctx, method, caller, args, value, hooks, evm) + case DelegationMethod: + return p.delegation(ctx, method, args, value) + case ValidatorsMethod: + return p.validators(ctx, method, args, value) + case ValidatorMethod: + return p.validator(ctx, method, args, value) + case ValidatorDelegationsMethod: + return p.validatorDelegations(ctx, method, args, value) + case ValidatorUnbondingDelegationsMethod: + return p.validatorUnbondingDelegations(ctx, method, args, value) + case UnbondingDelegationMethod: + return p.unbondingDelegation(ctx, method, args, value) + case DelegatorDelegationsMethod: + return p.delegatorDelegations(ctx, method, args, value) + case DelegatorValidatorMethod: + return p.delegatorValidator(ctx, method, args, value) + case DelegatorUnbondingDelegationsMethod: + return p.delegatorUnbondingDelegations(ctx, method, args, value) + case RedelegationsMethod: + return p.redelegations(ctx, method, args, value) + case DelegatorValidatorsMethod: + return p.delegatorValidators(ctx, method, args, value) + case HistoricalInfoMethod: + return p.historicalInfo(ctx, method, args, value) + case PoolMethod: + return p.pool(ctx, method, args, value) + case ParamsMethod: + return p.params(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + // if delegator is associated, then it must have Account set already + // if delegator is not associated, then it can't delegate anyway (since + // there is no good way to merge delegations if it becomes associated) + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) + } + validatorBech32 := args[0].(string) + if value == nil || value.Sign() == 0 { + return nil, 0, errors.New("set `value` field to non-zero to send delegate fund") + } + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), delegator, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + return nil, 0, err + } + _, err = p.stakingKeeper.Delegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgDelegate{ + DelegatorAddress: delegator.String(), + ValidatorAddress: validatorBech32, + Amount: coin, + }) + if err != nil { + return nil, 0, err + } + + // Emit EVM event + if emitErr := pcommon.EmitDelegateEvent(evm, p.address, caller, validatorBech32, value); emitErr != nil { + // Log error but don't fail the transaction + ctx.Logger().Error("Failed to emit EVM delegate event", "error", emitErr) + } + + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + return nil, 0, err + } + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) + } + srcValidatorBech32 := args[0].(string) + dstValidatorBech32 := args[1].(string) + amount := args[2].(*big.Int) + _, err := p.stakingKeeper.BeginRedelegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgBeginRedelegate{ + DelegatorAddress: delegator.String(), + ValidatorSrcAddress: srcValidatorBech32, + ValidatorDstAddress: dstValidatorBech32, + Amount: sdk.NewCoin(sdk.MustGetBaseDenom(), sdk.NewIntFromBigInt(amount)), + }) + if err != nil { + return nil, 0, err + } + + // Emit EVM event + if emitErr := pcommon.EmitRedelegateEvent(evm, p.address, caller, srcValidatorBech32, dstValidatorBech32, amount); emitErr != nil { + // Log error but don't fail the transaction + ctx.Logger().Error("Failed to emit EVM redelegate event", "error", emitErr) + } + + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) + } + validatorBech32 := args[0].(string) + amount := args[1].(*big.Int) + _, err := p.stakingKeeper.Undelegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgUndelegate{ + DelegatorAddress: delegator.String(), + ValidatorAddress: validatorBech32, + Amount: sdk.NewCoin(p.evmKeeper.GetBaseDenom(ctx), sdk.NewIntFromBigInt(amount)), + }) + if err != nil { + return nil, 0, err + } + + // Emit EVM event + if emitErr := pcommon.EmitUndelegateEvent(evm, p.address, caller, validatorBech32, amount); emitErr != nil { + // Log error but don't fail the transaction + ctx.Logger().Error("Failed to emit EVM undelegate event", "error", emitErr) + } + + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +type Delegation struct { + Balance Balance + Delegation DelegationDetails +} + +type Balance struct { + Amount *big.Int + Denom string +} + +type DelegationDetails struct { + DelegatorAddress string + Shares *big.Int + Decimals *big.Int + ValidatorAddress string +} + +func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + validatorBech32 := args[1].(string) + delegationRequest := &stakingtypes.QueryDelegationRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + delegationResponse, err := p.stakingQuerier.Delegation(sdk.WrapSDKContext(ctx), delegationRequest) + if err != nil { + return nil, 0, err + } + + delegation := Delegation{ + Balance: Balance{ + Amount: delegationResponse.GetDelegationResponse().GetBalance().Amount.BigInt(), + Denom: delegationResponse.GetDelegationResponse().GetBalance().Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: delegationResponse.GetDelegationResponse().GetDelegation().DelegatorAddress, + Shares: delegationResponse.GetDelegationResponse().GetDelegation().Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: delegationResponse.GetDelegationResponse().GetDelegation().ValidatorAddress, + }, + } + + bz, err := method.Outputs.Pack(delegation) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +type ValidatorsResponse struct { + Validators []Validator + NextKey []byte +} + +type DelegationsResponse struct { + Delegations []Delegation + NextKey []byte +} + +type UnbondingDelegationsResponse struct { + UnbondingDelegations []UnbondingDelegation + NextKey []byte +} + +type RedelegationsResponse struct { + Redelegations []Redelegation + NextKey []byte +} + +type Validator struct { + OperatorAddress string + ConsensusPubkey []byte + Jailed bool + Status int32 + Tokens string + DelegatorShares string + Description string + UnbondingHeight int64 + UnbondingTime int64 + CommissionRate string + CommissionMaxRate string + CommissionMaxChangeRate string + CommissionUpdateTime int64 + MinSelfDelegation string +} + +func (p PrecompileExecutor) validators(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorsRequest := &stakingtypes.QueryValidatorsRequest{ + Status: args[0].(string), + Pagination: &query.PageRequest{ + Key: args[1].([]byte), + }, + } + + validatorsResponse, err := p.stakingQuerier.Validators(sdk.WrapSDKContext(ctx), validatorsRequest) + if err != nil { + return nil, 0, err + } + + res := ValidatorsResponse{ + Validators: make([]Validator, len(validatorsResponse.Validators)), + NextKey: validatorsResponse.Pagination.NextKey, + } + for i, validator := range validatorsResponse.Validators { + res.Validators[i] = Validator{ + OperatorAddress: validator.OperatorAddress, + ConsensusPubkey: validator.ConsensusPubkey.Value, + Jailed: validator.Jailed, + Status: int32(validator.Status), + Tokens: validator.Tokens.String(), + DelegatorShares: validator.DelegatorShares.String(), + Description: validator.Description.String(), + UnbondingHeight: validator.UnbondingHeight, + UnbondingTime: validator.UnbondingTime.Unix(), + CommissionRate: validator.Commission.Rate.String(), + CommissionMaxRate: validator.Commission.MaxRate.String(), + CommissionMaxChangeRate: validator.Commission.MaxChangeRate.String(), + CommissionUpdateTime: validator.Commission.UpdateTime.Unix(), + MinSelfDelegation: validator.MinSelfDelegation.String(), + } + } + + bz, err := method.Outputs.Pack(res) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { + if err := pcommon.ValidateArgsLength(args, 6); err != nil { + return nil, 0, err + } + + // Extract arguments + pubKeyHex := args[0].(string) + moniker := args[1].(string) + commissionRateStr := args[2].(string) + commissionMaxRateStr := args[3].(string) + commissionMaxChangeRateStr := args[4].(string) + minSelfDelegation := args[5].(*big.Int) + + // Get validator address (caller's associated Sei address) + valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse public key from hex + pubKeyBytes, err := hex.DecodeString(pubKeyHex) + if err != nil { + return nil, 0, errors.New("invalid public key hex format") + } + + // Create ed25519 public key + pubKey := &ed25519.PubKey{Key: pubKeyBytes} + + // Parse commission rates + commissionRate, err := sdk.NewDecFromStr(commissionRateStr) + if err != nil { + return nil, 0, errors.New("invalid commission rate") + } + + commissionMaxRate, err := sdk.NewDecFromStr(commissionMaxRateStr) + if err != nil { + return nil, 0, errors.New("invalid commission max rate") + } + + commissionMaxChangeRate, err := sdk.NewDecFromStr(commissionMaxChangeRateStr) + if err != nil { + return nil, 0, errors.New("invalid commission max change rate") + } + + commission := stakingtypes.NewCommissionRates(commissionRate, commissionMaxRate, commissionMaxChangeRate) + + if value == nil || value.Sign() == 0 { + return nil, 0, errors.New("set `value` field to non-zero to send delegate fund") + } + + // Validate minimum self delegation + if minSelfDelegation == nil || minSelfDelegation.Sign() <= 0 { + return nil, 0, errors.New("minimum self delegation must be a positive integer: invalid request") + } + + coin, err := pcommon.HandlePaymentUsei( + ctx, + p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), + valAddress, + value, + p.bankKeeper, + p.evmKeeper, + hooks, + evm.GetDepth()) + if err != nil { + return nil, 0, err + } + + description := stakingtypes.NewDescription(moniker, "", "", "", "") + + msg, err := stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(valAddress), + pubKey, + coin, + description, + commission, + sdk.NewIntFromBigInt(minSelfDelegation), + ) + if err != nil { + return nil, 0, err + } + + if err := msg.ValidateBasic(); err != nil { + return nil, 0, err + } + + _, err = p.stakingKeeper.CreateValidator(sdk.WrapSDKContext(ctx), msg) + if err != nil { + return nil, 0, err + } + + // Emit EVM event + if emitErr := pcommon.EmitValidatorCreatedEvent(evm, p.address, caller, sdk.ValAddress(valAddress).String(), moniker); emitErr != nil { + // Log error but don't fail the transaction + ctx.Logger().Error("Failed to emit EVM validator created event", "error", emitErr) + } + + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + // Extract arguments + moniker := args[0].(string) + commissionRateStr := args[1].(string) + minSelfDelegation := args[2].(*big.Int) + + // Get validator address (caller's associated Sei address) + valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !associated { + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) + } + + // Parse commission rate if provided + var commissionRate *sdk.Dec + if commissionRateStr != "" { + rate, err := sdk.NewDecFromStr(commissionRateStr) + if err != nil { + return nil, 0, errors.New("invalid commission rate") + } + commissionRate = &rate + } + + // Convert min self delegation if not zero + var minSelfDelegationInt *sdk.Int + if minSelfDelegation != nil && minSelfDelegation.Sign() > 0 { + msd := sdk.NewIntFromBigInt(minSelfDelegation) + minSelfDelegationInt = &msd + } + + description := stakingtypes.NewDescription( + moniker, + stakingtypes.DoNotModifyDesc, + stakingtypes.DoNotModifyDesc, + stakingtypes.DoNotModifyDesc, + stakingtypes.DoNotModifyDesc, + ) + + msg := stakingtypes.NewMsgEditValidator( + sdk.ValAddress(valAddress), + description, + commissionRate, + minSelfDelegationInt, + ) + + if err := msg.ValidateBasic(); err != nil { + return nil, 0, err + } + + _, err := p.stakingKeeper.EditValidator(sdk.WrapSDKContext(ctx), msg) + if err != nil { + return nil, 0, err + } + + // Emit EVM event + if emitErr := pcommon.EmitValidatorEditedEvent(evm, p.address, caller, sdk.ValAddress(valAddress).String(), moniker); emitErr != nil { + // Log error but don't fail the transaction + ctx.Logger().Error("Failed to emit EVM validator edited event", "error", emitErr) + } + + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validator(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + validatorRequest := &stakingtypes.QueryValidatorRequest{ + ValidatorAddr: validatorBech32, + } + + validatorResponse, err := p.stakingQuerier.Validator(sdk.WrapSDKContext(ctx), validatorRequest) + if err != nil { + return nil, 0, err + } + + validator := convertValidatorToPrecompileType(validatorResponse.Validator) + bz, err := method.Outputs.Pack(validator) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validatorDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + nextKey := args[1].([]byte) + + request := &stakingtypes.QueryValidatorDelegationsRequest{ + ValidatorAddr: validatorBech32, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.ValidatorDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + delegations := make([]Delegation, len(response.DelegationResponses)) + for i, dr := range response.DelegationResponses { + delegations[i] = Delegation{ + Balance: Balance{ + Amount: dr.Balance.Amount.BigInt(), + Denom: dr.Balance.Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: dr.Delegation.DelegatorAddress, + Shares: dr.Delegation.Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: dr.Delegation.ValidatorAddress, + }, + } + } + + result := DelegationsResponse{ + Delegations: delegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validatorUnbondingDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + nextKey := args[1].([]byte) + + request := &stakingtypes.QueryValidatorUnbondingDelegationsRequest{ + ValidatorAddr: validatorBech32, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.ValidatorUnbondingDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + unbondingDelegations := make([]UnbondingDelegation, len(response.UnbondingResponses)) + for i, ubd := range response.UnbondingResponses { + entries := make([]UnbondingDelegationEntry, len(ubd.Entries)) + for j, entry := range ubd.Entries { + entries[j] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + unbondingDelegations[i] = UnbondingDelegation{ + DelegatorAddress: ubd.DelegatorAddress, + ValidatorAddress: ubd.ValidatorAddress, + Entries: entries, + } + } + + result := UnbondingDelegationsResponse{ + UnbondingDelegations: unbondingDelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) unbondingDelegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + validatorBech32 := args[1].(string) + request := &stakingtypes.QueryUnbondingDelegationRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + response, err := p.stakingQuerier.UnbondingDelegation(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + entries := make([]UnbondingDelegationEntry, len(response.Unbond.Entries)) + for i, entry := range response.Unbond.Entries { + entries[i] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + + unbondingDelegation := UnbondingDelegation{ + DelegatorAddress: response.Unbond.DelegatorAddress, + ValidatorAddress: response.Unbond.ValidatorAddress, + Entries: entries, + } + + bz, err := method.Outputs.Pack(unbondingDelegation) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorDelegationsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + delegations := make([]Delegation, len(response.DelegationResponses)) + for i, dr := range response.DelegationResponses { + delegations[i] = Delegation{ + Balance: Balance{ + Amount: dr.Balance.Amount.BigInt(), + Denom: dr.Balance.Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: dr.Delegation.DelegatorAddress, + Shares: dr.Delegation.Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: dr.Delegation.ValidatorAddress, + }, + } + } + + result := DelegationsResponse{ + Delegations: delegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorValidator(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + validatorBech32 := args[1].(string) + request := &stakingtypes.QueryDelegatorValidatorRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + response, err := p.stakingQuerier.DelegatorValidator(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + validator := convertValidatorToPrecompileType(response.Validator) + bz, err := method.Outputs.Pack(validator) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorUnbondingDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorUnbondingDelegationsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorUnbondingDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + unbondingDelegations := make([]UnbondingDelegation, len(response.UnbondingResponses)) + for i, ubd := range response.UnbondingResponses { + entries := make([]UnbondingDelegationEntry, len(ubd.Entries)) + for j, entry := range ubd.Entries { + entries[j] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + unbondingDelegations[i] = UnbondingDelegation{ + DelegatorAddress: ubd.DelegatorAddress, + ValidatorAddress: ubd.ValidatorAddress, + Entries: entries, + } + } + + result := UnbondingDelegationsResponse{ + UnbondingDelegations: unbondingDelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) redelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + + delegatorStr := args[0].(string) + srcValidatorStr := args[1].(string) + dstValidatorStr := args[2].(string) + nextKey := args[3].([]byte) + + request := &stakingtypes.QueryRedelegationsRequest{ + DelegatorAddr: delegatorStr, + SrcValidatorAddr: srcValidatorStr, + DstValidatorAddr: dstValidatorStr, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.Redelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + redelegations := make([]Redelegation, len(response.RedelegationResponses)) + for i, redel := range response.RedelegationResponses { + entries := make([]RedelegationEntry, len(redel.Entries)) + for j, entry := range redel.Entries { + entries[j] = RedelegationEntry{ + CreationHeight: entry.RedelegationEntry.CreationHeight, + CompletionTime: entry.RedelegationEntry.CompletionTime.Unix(), + InitialBalance: entry.RedelegationEntry.InitialBalance.String(), + SharesDst: entry.Balance.String(), + } + } + redelegations[i] = Redelegation{ + DelegatorAddress: redel.Redelegation.DelegatorAddress, + ValidatorSrcAddress: redel.Redelegation.ValidatorSrcAddress, + ValidatorDstAddress: redel.Redelegation.ValidatorDstAddress, + Entries: entries, + } + } + + result := RedelegationsResponse{ + Redelegations: redelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorValidators(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorValidatorsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorValidators(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + validators := make([]Validator, len(response.Validators)) + for i, val := range response.Validators { + validators[i] = convertValidatorToPrecompileType(val) + } + + result := ValidatorsResponse{ + Validators: validators, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) historicalInfo(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + height := args[0].(int64) + request := &stakingtypes.QueryHistoricalInfoRequest{ + Height: height, + } + + response, err := p.stakingQuerier.HistoricalInfo(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + if response.Hist == nil { + return nil, 0, errors.New("historical info not found") + } + + validators := make([]Validator, len(response.Hist.Valset)) + for i, val := range response.Hist.Valset { + validators[i] = convertValidatorToPrecompileType(val) + } + + historicalInfo := HistoricalInfo{ + Height: height, // Use the requested height + Validators: validators, + } + + bz, err := method.Outputs.Pack(historicalInfo) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) pool(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + + request := &stakingtypes.QueryPoolRequest{} + response, err := p.stakingQuerier.Pool(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + pool := Pool{ + NotBondedTokens: response.Pool.NotBondedTokens.String(), + BondedTokens: response.Pool.BondedTokens.String(), + } + + bz, err := method.Outputs.Pack(pool) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) params(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + + request := &stakingtypes.QueryParamsRequest{} + response, err := p.stakingQuerier.Params(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + params := Params{ + UnbondingTime: uint64(response.Params.UnbondingTime.Seconds()), + MaxValidators: response.Params.MaxValidators, + MaxEntries: response.Params.MaxEntries, + HistoricalEntries: response.Params.HistoricalEntries, + BondDenom: response.Params.BondDenom, + MinCommissionRate: response.Params.MinCommissionRate.String(), + MaxVotingPowerRatio: response.Params.MaxVotingPowerRatio.String(), + MaxVotingPowerEnforcementThreshold: response.Params.MaxVotingPowerEnforcementThreshold.String(), + } + + bz, err := method.Outputs.Pack(params) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +// Helper function to convert stakingtypes.Validator to precompile Validator type +func convertValidatorToPrecompileType(val stakingtypes.Validator) Validator { + return Validator{ + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + } +} + +// Additional types for new query methods +type UnbondingDelegationEntry struct { + CreationHeight int64 + CompletionTime int64 + InitialBalance string + Balance string +} + +type UnbondingDelegation struct { + DelegatorAddress string + ValidatorAddress string + Entries []UnbondingDelegationEntry +} + +type RedelegationEntry struct { + CreationHeight int64 + CompletionTime int64 + InitialBalance string + SharesDst string +} + +type Redelegation struct { + DelegatorAddress string + ValidatorSrcAddress string + ValidatorDstAddress string + Entries []RedelegationEntry +} + +type HistoricalInfo struct { + Height int64 + Validators []Validator +} + +type Pool struct { + NotBondedTokens string + BondedTokens string +} + +type Params struct { + UnbondingTime uint64 + MaxValidators uint32 + MaxEntries uint32 + HistoricalEntries uint32 + BondDenom string + MinCommissionRate string + MaxVotingPowerRatio string + MaxVotingPowerEnforcementThreshold string +} diff --git a/precompiles/staking/setup.go b/precompiles/staking/setup.go index cf8103ef9e..bfc0f16982 100644 --- a/precompiles/staking/setup.go +++ b/precompiles/staking/setup.go @@ -9,6 +9,8 @@ import ( stakingv605 "github.com/sei-protocol/sei-chain/precompiles/staking/legacy/v605" stakingv606 "github.com/sei-protocol/sei-chain/precompiles/staking/legacy/v606" stakingv610 "github.com/sei-protocol/sei-chain/precompiles/staking/legacy/v610" + stakingv614 "github.com/sei-protocol/sei-chain/precompiles/staking/legacy/v614" + stakingv620 "github.com/sei-protocol/sei-chain/precompiles/staking/legacy/v620" "github.com/sei-protocol/sei-chain/precompiles/utils" ) @@ -22,6 +24,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(stakingv605.NewPrecompile(keepers)), "v6.0.6": check(stakingv606.NewPrecompile(keepers)), "v6.1.0": check(stakingv610.NewPrecompile(keepers)), + "v6.1.4": check(stakingv614.NewPrecompile(keepers)), + "v6.2.0": check(stakingv620.NewPrecompile(keepers)), } } diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index 5c744c4120..d6f7aa2785 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -1,7 +1,6 @@ package staking import ( - "bytes" "embed" "encoding/hex" "errors" @@ -9,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -20,12 +20,25 @@ import ( ) const ( - DelegateMethod = "delegate" - RedelegateMethod = "redelegate" - UndelegateMethod = "undelegate" - DelegationMethod = "delegation" - CreateValidatorMethod = "createValidator" - EditValidatorMethod = "editValidator" + DelegateMethod = "delegate" + RedelegateMethod = "redelegate" + UndelegateMethod = "undelegate" + DelegationMethod = "delegation" + CreateValidatorMethod = "createValidator" + EditValidatorMethod = "editValidator" + ValidatorsMethod = "validators" + ValidatorMethod = "validator" + ValidatorDelegationsMethod = "validatorDelegations" + ValidatorUnbondingDelegationsMethod = "validatorUnbondingDelegations" + UnbondingDelegationMethod = "unbondingDelegation" + DelegatorDelegationsMethod = "delegatorDelegations" + DelegatorValidatorMethod = "delegatorValidator" + DelegatorUnbondingDelegationsMethod = "delegatorUnbondingDelegations" + RedelegationsMethod = "redelegations" + DelegatorValidatorsMethod = "delegatorValidators" + HistoricalInfoMethod = "historicalInfo" + PoolMethod = "pool" + ParamsMethod = "params" ) const ( @@ -44,15 +57,28 @@ type PrecompileExecutor struct { bankKeeper utils.BankKeeper address common.Address - DelegateID []byte - RedelegateID []byte - UndelegateID []byte - DelegationID []byte - CreateValidatorID []byte - EditValidatorID []byte + DelegateID []byte + RedelegateID []byte + UndelegateID []byte + DelegationID []byte + CreateValidatorID []byte + EditValidatorID []byte + ValidatorsID []byte + ValidatorID []byte + ValidatorDelegationsID []byte + ValidatorUnbondingDelegationsID []byte + UnbondingDelegationID []byte + DelegatorDelegationsID []byte + DelegatorValidatorID []byte + DelegatorUnbondingDelegationsID []byte + RedelegationsID []byte + DelegatorValidatorsID []byte + HistoricalInfoID []byte + PoolID []byte + ParamsID []byte } -func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { newAbi := pcommon.MustGetABI(f, "abi.json") p := &PrecompileExecutor{ @@ -77,85 +103,122 @@ func NewPrecompile(keepers utils.Keepers) (*pcommon.Precompile, error) { p.CreateValidatorID = m.ID case EditValidatorMethod: p.EditValidatorID = m.ID + case ValidatorsMethod: + p.ValidatorsID = m.ID + case ValidatorMethod: + p.ValidatorID = m.ID + case ValidatorDelegationsMethod: + p.ValidatorDelegationsID = m.ID + case ValidatorUnbondingDelegationsMethod: + p.ValidatorUnbondingDelegationsID = m.ID + case UnbondingDelegationMethod: + p.UnbondingDelegationID = m.ID + case DelegatorDelegationsMethod: + p.DelegatorDelegationsID = m.ID + case DelegatorValidatorMethod: + p.DelegatorValidatorID = m.ID + case DelegatorUnbondingDelegationsMethod: + p.DelegatorUnbondingDelegationsID = m.ID + case RedelegationsMethod: + p.RedelegationsID = m.ID + case DelegatorValidatorsMethod: + p.DelegatorValidatorsID = m.ID + case HistoricalInfoMethod: + p.HistoricalInfoID = m.ID + case PoolMethod: + p.PoolID = m.ID + case ParamsMethod: + p.ParamsID = m.ID } } - return pcommon.NewPrecompile(newAbi, p, p.address, "staking"), nil + return pcommon.NewDynamicGasPrecompile(newAbi, p, p.address, "staking"), nil } -// RequiredGas returns the required bare minimum gas to execute the precompile. -func (p PrecompileExecutor) RequiredGas(input []byte, method *abi.Method) uint64 { - if bytes.Equal(method.ID, p.DelegateID) { - return 50000 - } else if bytes.Equal(method.ID, p.RedelegateID) { - return 70000 - } else if bytes.Equal(method.ID, p.UndelegateID) { - return 50000 - } else if bytes.Equal(method.ID, p.CreateValidatorID) { - return 100000 - } else if bytes.Equal(method.ID, p.EditValidatorID) { - return 100000 - } else if bytes.Equal(method.ID, p.DelegationID) { - return pcommon.DefaultGasCost(input, false) - } - // This should never happen since this is going to fail during Run - return pcommon.UnknownMethodCallGas +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper } -func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, hooks *tracing.Hooks) (bz []byte, err error) { +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { if ctx.EVMPrecompileCalledFromDelegateCall() { - return nil, errors.New("cannot delegatecall staking") + return nil, 0, errors.New("cannot delegatecall staking") } switch method.Name { case DelegateMethod: if readOnly { - return nil, errors.New("cannot call staking precompile from staticcall") + return nil, 0, errors.New("cannot call staking precompile from staticcall") } return p.delegate(ctx, method, caller, args, value, hooks, evm) case RedelegateMethod: if readOnly { - return nil, errors.New("cannot call staking precompile from staticcall") + return nil, 0, errors.New("cannot call staking precompile from staticcall") } return p.redelegate(ctx, method, caller, args, value, evm) case UndelegateMethod: if readOnly { - return nil, errors.New("cannot call staking precompile from staticcall") + return nil, 0, errors.New("cannot call staking precompile from staticcall") } return p.undelegate(ctx, method, caller, args, value, evm) case CreateValidatorMethod: if readOnly { - return nil, errors.New("cannot call staking precompile from staticcall") + return nil, 0, errors.New("cannot call staking precompile from staticcall") } return p.createValidator(ctx, method, caller, args, value, hooks, evm) case EditValidatorMethod: if readOnly { - return nil, errors.New("cannot call staking precompile from staticcall") + return nil, 0, errors.New("cannot call staking precompile from staticcall") } return p.editValidator(ctx, method, caller, args, value, hooks, evm) case DelegationMethod: return p.delegation(ctx, method, args, value) + case ValidatorsMethod: + return p.validators(ctx, method, args, value) + case ValidatorMethod: + return p.validator(ctx, method, args, value) + case ValidatorDelegationsMethod: + return p.validatorDelegations(ctx, method, args, value) + case ValidatorUnbondingDelegationsMethod: + return p.validatorUnbondingDelegations(ctx, method, args, value) + case UnbondingDelegationMethod: + return p.unbondingDelegation(ctx, method, args, value) + case DelegatorDelegationsMethod: + return p.delegatorDelegations(ctx, method, args, value) + case DelegatorValidatorMethod: + return p.delegatorValidator(ctx, method, args, value) + case DelegatorUnbondingDelegationsMethod: + return p.delegatorUnbondingDelegations(ctx, method, args, value) + case RedelegationsMethod: + return p.redelegations(ctx, method, args, value) + case DelegatorValidatorsMethod: + return p.delegatorValidators(ctx, method, args, value) + case HistoricalInfoMethod: + return p.historicalInfo(ctx, method, args, value) + case PoolMethod: + return p.pool(ctx, method, args, value) + case ParamsMethod: + return p.params(ctx, method, args, value) } return } -func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { +func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { if err := pcommon.ValidateArgsLength(args, 1); err != nil { - return nil, err + return nil, 0, err } // if delegator is associated, then it must have Account set already // if delegator is not associated, then it can't delegate anyway (since // there is no good way to merge delegations if it becomes associated) delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) if !associated { - return nil, types.NewAssociationMissingErr(caller.Hex()) + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) } validatorBech32 := args[0].(string) if value == nil || value.Sign() == 0 { - return nil, errors.New("set `value` field to non-zero to send delegate fund") + return nil, 0, errors.New("set `value` field to non-zero to send delegate fund") } coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), delegator, value, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) if err != nil { - return nil, err + return nil, 0, err } _, err = p.stakingKeeper.Delegate(sdk.WrapSDKContext(ctx), &stakingtypes.MsgDelegate{ DelegatorAddress: delegator.String(), @@ -163,7 +226,7 @@ func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller Amount: coin, }) if err != nil { - return nil, err + return nil, 0, err } // Emit EVM event @@ -172,20 +235,24 @@ func (p PrecompileExecutor) delegate(ctx sdk.Context, method *abi.Method, caller ctx.Logger().Error("Failed to emit EVM delegate event", "error", emitErr) } - return method.Outputs.Pack(true) + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil } -func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, error) { +func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, uint64, error) { if err := pcommon.ValidateNonPayable(value); err != nil { - return nil, err + return nil, 0, err } if err := pcommon.ValidateArgsLength(args, 3); err != nil { - return nil, err + return nil, 0, err } delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) if !associated { - return nil, types.NewAssociationMissingErr(caller.Hex()) + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) } srcValidatorBech32 := args[0].(string) dstValidatorBech32 := args[1].(string) @@ -197,7 +264,7 @@ func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, call Amount: sdk.NewCoin(sdk.MustGetBaseDenom(), sdk.NewIntFromBigInt(amount)), }) if err != nil { - return nil, err + return nil, 0, err } // Emit EVM event @@ -206,20 +273,24 @@ func (p PrecompileExecutor) redelegate(ctx sdk.Context, method *abi.Method, call ctx.Logger().Error("Failed to emit EVM redelegate event", "error", emitErr) } - return method.Outputs.Pack(true) + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil } -func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, error) { +func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM) ([]byte, uint64, error) { if err := pcommon.ValidateNonPayable(value); err != nil { - return nil, err + return nil, 0, err } if err := pcommon.ValidateArgsLength(args, 2); err != nil { - return nil, err + return nil, 0, err } delegator, associated := p.evmKeeper.GetSeiAddress(ctx, caller) if !associated { - return nil, types.NewAssociationMissingErr(caller.Hex()) + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) } validatorBech32 := args[0].(string) amount := args[1].(*big.Int) @@ -229,7 +300,7 @@ func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, call Amount: sdk.NewCoin(p.evmKeeper.GetBaseDenom(ctx), sdk.NewIntFromBigInt(amount)), }) if err != nil { - return nil, err + return nil, 0, err } // Emit EVM event @@ -238,7 +309,11 @@ func (p PrecompileExecutor) undelegate(ctx sdk.Context, method *abi.Method, call ctx.Logger().Error("Failed to emit EVM undelegate event", "error", emitErr) } - return method.Outputs.Pack(true) + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil } type Delegation struct { @@ -258,18 +333,18 @@ type DelegationDetails struct { ValidatorAddress string } -func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, error) { +func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { if err := pcommon.ValidateNonPayable(value); err != nil { - return nil, err + return nil, 0, err } if err := pcommon.ValidateArgsLength(args, 2); err != nil { - return nil, err + return nil, 0, err } seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) if err != nil { - return nil, err + return nil, 0, err } validatorBech32 := args[1].(string) @@ -280,7 +355,7 @@ func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args delegationResponse, err := p.stakingQuerier.Delegation(sdk.WrapSDKContext(ctx), delegationRequest) if err != nil { - return nil, err + return nil, 0, err } delegation := Delegation{ @@ -296,12 +371,104 @@ func (p PrecompileExecutor) delegation(ctx sdk.Context, method *abi.Method, args }, } - return method.Outputs.Pack(delegation) + bz, err := method.Outputs.Pack(delegation) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +type ValidatorsResponse struct { + Validators []Validator + NextKey []byte } -func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { +type DelegationsResponse struct { + Delegations []Delegation + NextKey []byte +} + +type UnbondingDelegationsResponse struct { + UnbondingDelegations []UnbondingDelegation + NextKey []byte +} + +type RedelegationsResponse struct { + Redelegations []Redelegation + NextKey []byte +} + +type Validator struct { + OperatorAddress string + ConsensusPubkey []byte + Jailed bool + Status int32 + Tokens string + DelegatorShares string + Description string + UnbondingHeight int64 + UnbondingTime int64 + CommissionRate string + CommissionMaxRate string + CommissionMaxChangeRate string + CommissionUpdateTime int64 + MinSelfDelegation string +} + +func (p PrecompileExecutor) validators(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorsRequest := &stakingtypes.QueryValidatorsRequest{ + Status: args[0].(string), + Pagination: &query.PageRequest{ + Key: args[1].([]byte), + }, + } + + validatorsResponse, err := p.stakingQuerier.Validators(sdk.WrapSDKContext(ctx), validatorsRequest) + if err != nil { + return nil, 0, err + } + + res := ValidatorsResponse{ + Validators: make([]Validator, len(validatorsResponse.Validators)), + NextKey: validatorsResponse.Pagination.NextKey, + } + for i, validator := range validatorsResponse.Validators { + res.Validators[i] = Validator{ + OperatorAddress: validator.OperatorAddress, + ConsensusPubkey: validator.ConsensusPubkey.Value, + Jailed: validator.Jailed, + Status: int32(validator.Status), + Tokens: validator.Tokens.String(), + DelegatorShares: validator.DelegatorShares.String(), + Description: validator.Description.String(), + UnbondingHeight: validator.UnbondingHeight, + UnbondingTime: validator.UnbondingTime.Unix(), + CommissionRate: validator.Commission.Rate.String(), + CommissionMaxRate: validator.Commission.MaxRate.String(), + CommissionMaxChangeRate: validator.Commission.MaxChangeRate.String(), + CommissionUpdateTime: validator.Commission.UpdateTime.Unix(), + MinSelfDelegation: validator.MinSelfDelegation.String(), + } + } + + bz, err := method.Outputs.Pack(res) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { if err := pcommon.ValidateArgsLength(args, 6); err != nil { - return nil, err + return nil, 0, err } // Extract arguments @@ -315,13 +482,13 @@ func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, // Get validator address (caller's associated Sei address) valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) if !associated { - return nil, types.NewAssociationMissingErr(caller.Hex()) + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) } // Parse public key from hex pubKeyBytes, err := hex.DecodeString(pubKeyHex) if err != nil { - return nil, errors.New("invalid public key hex format") + return nil, 0, errors.New("invalid public key hex format") } // Create ed25519 public key @@ -330,28 +497,28 @@ func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, // Parse commission rates commissionRate, err := sdk.NewDecFromStr(commissionRateStr) if err != nil { - return nil, errors.New("invalid commission rate") + return nil, 0, errors.New("invalid commission rate") } commissionMaxRate, err := sdk.NewDecFromStr(commissionMaxRateStr) if err != nil { - return nil, errors.New("invalid commission max rate") + return nil, 0, errors.New("invalid commission max rate") } commissionMaxChangeRate, err := sdk.NewDecFromStr(commissionMaxChangeRateStr) if err != nil { - return nil, errors.New("invalid commission max change rate") + return nil, 0, errors.New("invalid commission max change rate") } commission := stakingtypes.NewCommissionRates(commissionRate, commissionMaxRate, commissionMaxChangeRate) if value == nil || value.Sign() == 0 { - return nil, errors.New("set `value` field to non-zero to send delegate fund") + return nil, 0, errors.New("set `value` field to non-zero to send delegate fund") } // Validate minimum self delegation if minSelfDelegation == nil || minSelfDelegation.Sign() <= 0 { - return nil, errors.New("minimum self delegation must be a positive integer: invalid request") + return nil, 0, errors.New("minimum self delegation must be a positive integer: invalid request") } coin, err := pcommon.HandlePaymentUsei( @@ -364,7 +531,7 @@ func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, hooks, evm.GetDepth()) if err != nil { - return nil, err + return nil, 0, err } description := stakingtypes.NewDescription(moniker, "", "", "", "") @@ -378,16 +545,16 @@ func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, sdk.NewIntFromBigInt(minSelfDelegation), ) if err != nil { - return nil, err + return nil, 0, err } if err := msg.ValidateBasic(); err != nil { - return nil, err + return nil, 0, err } _, err = p.stakingKeeper.CreateValidator(sdk.WrapSDKContext(ctx), msg) if err != nil { - return nil, err + return nil, 0, err } // Emit EVM event @@ -396,16 +563,20 @@ func (p PrecompileExecutor) createValidator(ctx sdk.Context, method *abi.Method, ctx.Logger().Error("Failed to emit EVM validator created event", "error", emitErr) } - return method.Outputs.Pack(true) + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil } -func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, error) { +func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, caller common.Address, args []interface{}, value *big.Int, hooks *tracing.Hooks, evm *vm.EVM) ([]byte, uint64, error) { if err := pcommon.ValidateArgsLength(args, 3); err != nil { - return nil, err + return nil, 0, err } if err := pcommon.ValidateNonPayable(value); err != nil { - return nil, err + return nil, 0, err } // Extract arguments @@ -416,7 +587,7 @@ func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, c // Get validator address (caller's associated Sei address) valAddress, associated := p.evmKeeper.GetSeiAddress(ctx, caller) if !associated { - return nil, types.NewAssociationMissingErr(caller.Hex()) + return nil, 0, types.NewAssociationMissingErr(caller.Hex()) } // Parse commission rate if provided @@ -424,7 +595,7 @@ func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, c if commissionRateStr != "" { rate, err := sdk.NewDecFromStr(commissionRateStr) if err != nil { - return nil, errors.New("invalid commission rate") + return nil, 0, errors.New("invalid commission rate") } commissionRate = &rate } @@ -452,12 +623,12 @@ func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, c ) if err := msg.ValidateBasic(); err != nil { - return nil, err + return nil, 0, err } _, err := p.stakingKeeper.EditValidator(sdk.WrapSDKContext(ctx), msg) if err != nil { - return nil, err + return nil, 0, err } // Emit EVM event @@ -466,5 +637,607 @@ func (p PrecompileExecutor) editValidator(ctx sdk.Context, method *abi.Method, c ctx.Logger().Error("Failed to emit EVM validator edited event", "error", emitErr) } - return method.Outputs.Pack(true) + bz, err := method.Outputs.Pack(true) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validator(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + validatorRequest := &stakingtypes.QueryValidatorRequest{ + ValidatorAddr: validatorBech32, + } + + validatorResponse, err := p.stakingQuerier.Validator(sdk.WrapSDKContext(ctx), validatorRequest) + if err != nil { + return nil, 0, err + } + + validator := convertValidatorToPrecompileType(validatorResponse.Validator) + bz, err := method.Outputs.Pack(validator) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validatorDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + nextKey := args[1].([]byte) + + request := &stakingtypes.QueryValidatorDelegationsRequest{ + ValidatorAddr: validatorBech32, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.ValidatorDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + delegations := make([]Delegation, len(response.DelegationResponses)) + for i, dr := range response.DelegationResponses { + delegations[i] = Delegation{ + Balance: Balance{ + Amount: dr.Balance.Amount.BigInt(), + Denom: dr.Balance.Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: dr.Delegation.DelegatorAddress, + Shares: dr.Delegation.Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: dr.Delegation.ValidatorAddress, + }, + } + } + + result := DelegationsResponse{ + Delegations: delegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) validatorUnbondingDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + validatorBech32 := args[0].(string) + nextKey := args[1].([]byte) + + request := &stakingtypes.QueryValidatorUnbondingDelegationsRequest{ + ValidatorAddr: validatorBech32, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.ValidatorUnbondingDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + unbondingDelegations := make([]UnbondingDelegation, len(response.UnbondingResponses)) + for i, ubd := range response.UnbondingResponses { + entries := make([]UnbondingDelegationEntry, len(ubd.Entries)) + for j, entry := range ubd.Entries { + entries[j] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + unbondingDelegations[i] = UnbondingDelegation{ + DelegatorAddress: ubd.DelegatorAddress, + ValidatorAddress: ubd.ValidatorAddress, + Entries: entries, + } + } + + result := UnbondingDelegationsResponse{ + UnbondingDelegations: unbondingDelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) unbondingDelegation(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + validatorBech32 := args[1].(string) + request := &stakingtypes.QueryUnbondingDelegationRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + response, err := p.stakingQuerier.UnbondingDelegation(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + entries := make([]UnbondingDelegationEntry, len(response.Unbond.Entries)) + for i, entry := range response.Unbond.Entries { + entries[i] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + + unbondingDelegation := UnbondingDelegation{ + DelegatorAddress: response.Unbond.DelegatorAddress, + ValidatorAddress: response.Unbond.ValidatorAddress, + Entries: entries, + } + + bz, err := method.Outputs.Pack(unbondingDelegation) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorDelegationsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + delegations := make([]Delegation, len(response.DelegationResponses)) + for i, dr := range response.DelegationResponses { + delegations[i] = Delegation{ + Balance: Balance{ + Amount: dr.Balance.Amount.BigInt(), + Denom: dr.Balance.Denom, + }, + Delegation: DelegationDetails{ + DelegatorAddress: dr.Delegation.DelegatorAddress, + Shares: dr.Delegation.Shares.BigInt(), + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: dr.Delegation.ValidatorAddress, + }, + } + } + + result := DelegationsResponse{ + Delegations: delegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorValidator(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + validatorBech32 := args[1].(string) + request := &stakingtypes.QueryDelegatorValidatorRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + ValidatorAddr: validatorBech32, + } + + response, err := p.stakingQuerier.DelegatorValidator(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + validator := convertValidatorToPrecompileType(response.Validator) + bz, err := method.Outputs.Pack(validator) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorUnbondingDelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorUnbondingDelegationsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorUnbondingDelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + unbondingDelegations := make([]UnbondingDelegation, len(response.UnbondingResponses)) + for i, ubd := range response.UnbondingResponses { + entries := make([]UnbondingDelegationEntry, len(ubd.Entries)) + for j, entry := range ubd.Entries { + entries[j] = UnbondingDelegationEntry{ + CreationHeight: entry.CreationHeight, + CompletionTime: entry.CompletionTime.Unix(), + InitialBalance: entry.InitialBalance.String(), + Balance: entry.Balance.String(), + } + } + unbondingDelegations[i] = UnbondingDelegation{ + DelegatorAddress: ubd.DelegatorAddress, + ValidatorAddress: ubd.ValidatorAddress, + Entries: entries, + } + } + + result := UnbondingDelegationsResponse{ + UnbondingDelegations: unbondingDelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) redelegations(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 4); err != nil { + return nil, 0, err + } + + delegatorStr := args[0].(string) + srcValidatorStr := args[1].(string) + dstValidatorStr := args[2].(string) + nextKey := args[3].([]byte) + + request := &stakingtypes.QueryRedelegationsRequest{ + DelegatorAddr: delegatorStr, + SrcValidatorAddr: srcValidatorStr, + DstValidatorAddr: dstValidatorStr, + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.Redelegations(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + redelegations := make([]Redelegation, len(response.RedelegationResponses)) + for i, redel := range response.RedelegationResponses { + entries := make([]RedelegationEntry, len(redel.Entries)) + for j, entry := range redel.Entries { + entries[j] = RedelegationEntry{ + CreationHeight: entry.RedelegationEntry.CreationHeight, + CompletionTime: entry.RedelegationEntry.CompletionTime.Unix(), + InitialBalance: entry.RedelegationEntry.InitialBalance.String(), + SharesDst: entry.Balance.String(), + } + } + redelegations[i] = Redelegation{ + DelegatorAddress: redel.Redelegation.DelegatorAddress, + ValidatorSrcAddress: redel.Redelegation.ValidatorSrcAddress, + ValidatorDstAddress: redel.Redelegation.ValidatorDstAddress, + Entries: entries, + } + } + + result := RedelegationsResponse{ + Redelegations: redelegations, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) delegatorValidators(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + return nil, 0, err + } + + seiDelegatorAddress, err := pcommon.GetSeiAddressFromArg(ctx, args[0], p.evmKeeper) + if err != nil { + return nil, 0, err + } + + nextKey := args[1].([]byte) + request := &stakingtypes.QueryDelegatorValidatorsRequest{ + DelegatorAddr: seiDelegatorAddress.String(), + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + + response, err := p.stakingQuerier.DelegatorValidators(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + validators := make([]Validator, len(response.Validators)) + for i, val := range response.Validators { + validators[i] = convertValidatorToPrecompileType(val) + } + + result := ValidatorsResponse{ + Validators: validators, + NextKey: response.Pagination.NextKey, + } + + bz, err := method.Outputs.Pack(result) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) historicalInfo(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + return nil, 0, err + } + + height := args[0].(int64) + request := &stakingtypes.QueryHistoricalInfoRequest{ + Height: height, + } + + response, err := p.stakingQuerier.HistoricalInfo(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + if response.Hist == nil { + return nil, 0, errors.New("historical info not found") + } + + validators := make([]Validator, len(response.Hist.Valset)) + for i, val := range response.Hist.Valset { + validators[i] = convertValidatorToPrecompileType(val) + } + + historicalInfo := HistoricalInfo{ + Height: height, // Use the requested height + Validators: validators, + } + + bz, err := method.Outputs.Pack(historicalInfo) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) pool(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + + request := &stakingtypes.QueryPoolRequest{} + response, err := p.stakingQuerier.Pool(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + pool := Pool{ + NotBondedTokens: response.Pool.NotBondedTokens.String(), + BondedTokens: response.Pool.BondedTokens.String(), + } + + bz, err := method.Outputs.Pack(pool) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +func (p PrecompileExecutor) params(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) ([]byte, uint64, error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } + + if err := pcommon.ValidateArgsLength(args, 0); err != nil { + return nil, 0, err + } + + request := &stakingtypes.QueryParamsRequest{} + response, err := p.stakingQuerier.Params(sdk.WrapSDKContext(ctx), request) + if err != nil { + return nil, 0, err + } + + params := Params{ + UnbondingTime: uint64(response.Params.UnbondingTime.Seconds()), + MaxValidators: response.Params.MaxValidators, + MaxEntries: response.Params.MaxEntries, + HistoricalEntries: response.Params.HistoricalEntries, + BondDenom: response.Params.BondDenom, + MinCommissionRate: response.Params.MinCommissionRate.String(), + MaxVotingPowerRatio: response.Params.MaxVotingPowerRatio.String(), + MaxVotingPowerEnforcementThreshold: response.Params.MaxVotingPowerEnforcementThreshold.String(), + } + + bz, err := method.Outputs.Pack(params) + if err != nil { + return nil, 0, err + } + return bz, pcommon.GetRemainingGas(ctx, p.evmKeeper), nil +} + +// Helper function to convert stakingtypes.Validator to precompile Validator type +func convertValidatorToPrecompileType(val stakingtypes.Validator) Validator { + return Validator{ + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + } +} + +// Additional types for new query methods +type UnbondingDelegationEntry struct { + CreationHeight int64 + CompletionTime int64 + InitialBalance string + Balance string +} + +type UnbondingDelegation struct { + DelegatorAddress string + ValidatorAddress string + Entries []UnbondingDelegationEntry +} + +type RedelegationEntry struct { + CreationHeight int64 + CompletionTime int64 + InitialBalance string + SharesDst string +} + +type Redelegation struct { + DelegatorAddress string + ValidatorSrcAddress string + ValidatorDstAddress string + Entries []RedelegationEntry +} + +type HistoricalInfo struct { + Height int64 + Validators []Validator +} + +type Pool struct { + NotBondedTokens string + BondedTokens string +} + +type Params struct { + UnbondingTime uint64 + MaxValidators uint32 + MaxEntries uint32 + HistoricalEntries uint32 + BondDenom string + MinCommissionRate string + MaxVotingPowerRatio string + MaxVotingPowerEnforcementThreshold string } diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index 827228e87c..db11efd973 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -6,15 +6,18 @@ import ( "embed" "encoding/hex" "fmt" + "math" "math/big" "reflect" "testing" "time" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" crptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking/teststaking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -262,14 +265,79 @@ func setupValidator(t *testing.T, ctx sdk.Context, a *app.App, bondStatus stakin } type TestStakingQuerier struct { - Response *stakingtypes.QueryDelegationResponse - Err error + Response *stakingtypes.QueryDelegationResponse + ValidatorsResponse *stakingtypes.QueryValidatorsResponse + ValidatorResponse *stakingtypes.QueryValidatorResponse + ValidatorDelegationsResponse *stakingtypes.QueryValidatorDelegationsResponse + ValidatorUnbondingDelegationsResponse *stakingtypes.QueryValidatorUnbondingDelegationsResponse + UnbondingDelegationResponse *stakingtypes.QueryUnbondingDelegationResponse + DelegatorDelegationsResponse *stakingtypes.QueryDelegatorDelegationsResponse + DelegatorValidatorResponse *stakingtypes.QueryDelegatorValidatorResponse + DelegatorUnbondingDelegationsResponse *stakingtypes.QueryDelegatorUnbondingDelegationsResponse + RedelegationsResponse *stakingtypes.QueryRedelegationsResponse + DelegatorValidatorsResponse *stakingtypes.QueryDelegatorValidatorsResponse + HistoricalInfoResponse *stakingtypes.QueryHistoricalInfoResponse + PoolResponse *stakingtypes.QueryPoolResponse + ParamsResponse *stakingtypes.QueryParamsResponse + Err error } func (tq *TestStakingQuerier) Delegation(c context.Context, _ *stakingtypes.QueryDelegationRequest) (*stakingtypes.QueryDelegationResponse, error) { return tq.Response, tq.Err } +func (tq *TestStakingQuerier) Validators(c context.Context, _ *stakingtypes.QueryValidatorsRequest) (*stakingtypes.QueryValidatorsResponse, error) { + return tq.ValidatorsResponse, tq.Err +} + +func (tq *TestStakingQuerier) Validator(c context.Context, _ *stakingtypes.QueryValidatorRequest) (*stakingtypes.QueryValidatorResponse, error) { + return tq.ValidatorResponse, tq.Err +} + +func (tq *TestStakingQuerier) ValidatorDelegations(c context.Context, _ *stakingtypes.QueryValidatorDelegationsRequest) (*stakingtypes.QueryValidatorDelegationsResponse, error) { + return tq.ValidatorDelegationsResponse, tq.Err +} + +func (tq *TestStakingQuerier) ValidatorUnbondingDelegations(c context.Context, _ *stakingtypes.QueryValidatorUnbondingDelegationsRequest) (*stakingtypes.QueryValidatorUnbondingDelegationsResponse, error) { + return tq.ValidatorUnbondingDelegationsResponse, tq.Err +} + +func (tq *TestStakingQuerier) UnbondingDelegation(c context.Context, _ *stakingtypes.QueryUnbondingDelegationRequest) (*stakingtypes.QueryUnbondingDelegationResponse, error) { + return tq.UnbondingDelegationResponse, tq.Err +} + +func (tq *TestStakingQuerier) DelegatorDelegations(c context.Context, _ *stakingtypes.QueryDelegatorDelegationsRequest) (*stakingtypes.QueryDelegatorDelegationsResponse, error) { + return tq.DelegatorDelegationsResponse, tq.Err +} + +func (tq *TestStakingQuerier) DelegatorValidator(c context.Context, _ *stakingtypes.QueryDelegatorValidatorRequest) (*stakingtypes.QueryDelegatorValidatorResponse, error) { + return tq.DelegatorValidatorResponse, tq.Err +} + +func (tq *TestStakingQuerier) DelegatorUnbondingDelegations(c context.Context, _ *stakingtypes.QueryDelegatorUnbondingDelegationsRequest) (*stakingtypes.QueryDelegatorUnbondingDelegationsResponse, error) { + return tq.DelegatorUnbondingDelegationsResponse, tq.Err +} + +func (tq *TestStakingQuerier) Redelegations(c context.Context, _ *stakingtypes.QueryRedelegationsRequest) (*stakingtypes.QueryRedelegationsResponse, error) { + return tq.RedelegationsResponse, tq.Err +} + +func (tq *TestStakingQuerier) DelegatorValidators(c context.Context, _ *stakingtypes.QueryDelegatorValidatorsRequest) (*stakingtypes.QueryDelegatorValidatorsResponse, error) { + return tq.DelegatorValidatorsResponse, tq.Err +} + +func (tq *TestStakingQuerier) HistoricalInfo(c context.Context, _ *stakingtypes.QueryHistoricalInfoRequest) (*stakingtypes.QueryHistoricalInfoResponse, error) { + return tq.HistoricalInfoResponse, tq.Err +} + +func (tq *TestStakingQuerier) Pool(c context.Context, _ *stakingtypes.QueryPoolRequest) (*stakingtypes.QueryPoolResponse, error) { + return tq.PoolResponse, tq.Err +} + +func (tq *TestStakingQuerier) Params(c context.Context, _ *stakingtypes.QueryParamsRequest) (*stakingtypes.QueryParamsResponse, error) { + return tq.ParamsResponse, tq.Err +} + func TestPrecompile_Run_Delegation(t *testing.T) { callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() _, unassociatedEvmAddress := testkeeper.MockAddressPair() @@ -305,176 +373,1599 @@ func TestPrecompile_Run_Delegation(t *testing.T) { happyPathPackedOutput, _ := delegationMethod.Outputs.Pack(delegation) - type fields struct { - Precompile pcommon.Precompile - stakingKeeper utils.StakingKeeper - stakingQuerier utils.StakingQuerier - evmKeeper utils.EVMKeeper + type fields struct { + Precompile pcommon.Precompile + stakingKeeper utils.StakingKeeper + stakingQuerier utils.StakingQuerier + evmKeeper utils.EVMKeeper + } + type args struct { + evm *vm.EVM + delegatorAddress common.Address + validatorAddress string + caller common.Address + callingContract common.Address + value *big.Int + readOnly bool + isFromDelegateCall bool + } + + tests := []struct { + name string + fields fields + args args + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + delegatorAddress: callerEvmAddress, + validatorAddress: validatorAddress, + value: big.NewInt(100), + }, + wantRet: happyPathPackedOutput, + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "fails if caller != callingContract", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + caller: callerEvmAddress, + callingContract: contractEvmAddress, + delegatorAddress: callerEvmAddress, + validatorAddress: validatorAddress, + value: big.NewInt(100), + isFromDelegateCall: true, + }, + wantErr: true, + wantErrMsg: "cannot delegatecall staking", + }, + { + name: "fails if delegator address unassociated", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + caller: callerEvmAddress, + callingContract: callerEvmAddress, + delegatorAddress: unassociatedEvmAddress, + validatorAddress: validatorAddress, + }, + wantErr: true, + wantErrMsg: fmt.Sprintf("address %s is not linked", unassociatedEvmAddress.String()), + }, + { + name: "fails if delegator address is invalid", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + delegatorAddress: common.Address{}, + validatorAddress: validatorAddress, + caller: callerEvmAddress, + callingContract: callerEvmAddress, + }, + wantErr: true, + wantErrMsg: "invalid addr", + }, + { + name: "should return error if delegation not found", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Err: fmt.Errorf("delegation with delegator %s not found for validator", callerSeiAddress.String()), + }, + }, + args: args{ + delegatorAddress: callerEvmAddress, + validatorAddress: validatorAddress, + caller: callerEvmAddress, + callingContract: callerEvmAddress, + }, + wantErr: true, + wantErrMsg: fmt.Sprintf("delegation with delegator %s not found for validator", callerSeiAddress.String()), + }, + { + name: "should return delegation details", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + delegatorAddress: callerEvmAddress, + validatorAddress: validatorAddress, + caller: callerEvmAddress, + callingContract: callerEvmAddress, + }, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + { + name: "should allow static call", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + Response: delegationResponse, + }, + }, + args: args{ + delegatorAddress: callerEvmAddress, + validatorAddress: validatorAddress, + caller: callerEvmAddress, + callingContract: callerEvmAddress, + readOnly: true, + }, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + TxContext: vm.TxContext{Origin: callerEvmAddress}, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingKeeper: tt.fields.stakingKeeper, + StakingQuerier: tt.fields.stakingQuerier, + EVMKeeper: k, + }) + delegation, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegationID) + require.Nil(t, err) + inputs, err := delegation.Inputs.Pack(tt.args.delegatorAddress, tt.args.validatorAddress) + require.Nil(t, err) + gotRet, _, err := p.RunAndCalculateGas(&evm, tt.args.caller, tt.args.callingContract, append(p.GetExecutor().(*staking.PrecompileExecutor).DelegationID, inputs...), math.MaxUint64, tt.args.value, nil, tt.args.readOnly, tt.args.isFromDelegateCall) + if (err != nil) != tt.wantErr { + t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) + return + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + } else if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_Validators(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + validatorsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).ValidatorsID) + + // Build a single validator in the staking module format. + val := stakingtypes.Validator{ + OperatorAddress: "seivaloper1validator", + ConsensusPubkey: &codectypes.Any{Value: []byte("pubkey-bytes")}, + Jailed: false, + Status: stakingtypes.Bonded, + Tokens: sdk.NewInt(1000), + DelegatorShares: sdk.NewDec(1000), + Description: stakingtypes.NewDescription( + "moniker", + "identity", + "website", + "security", + "details", + ), + UnbondingHeight: 10, + UnbondingTime: time.Unix(1234, 0), + Commission: stakingtypes.Commission{ + CommissionRates: stakingtypes.CommissionRates{ + Rate: sdk.NewDecWithPrec(10, 2), + MaxRate: sdk.NewDecWithPrec(20, 2), + MaxChangeRate: sdk.NewDecWithPrec(1, 2), + }, + UpdateTime: time.Unix(5678, 0), + }, + MinSelfDelegation: sdk.NewInt(5), + } + + nextKey := []byte("next-key") + validatorsResponse := &stakingtypes.QueryValidatorsResponse{ + Validators: []stakingtypes.Validator{val}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + expected := staking.ValidatorsResponse{ + Validators: []staking.Validator{ + { + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := validatorsMethod.Outputs.Pack(expected) + + type fields struct { + stakingQuerier utils.StakingQuerier + } + type args struct { + status string + key []byte + value *big.Int + readOnly bool + } + + tests := []struct { + name string + fields fields + args args + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + ValidatorsResponse: validatorsResponse, + }, + }, + args: args{ + status: "BOND_STATUS_BONDED", + key: []byte{}, + value: big.NewInt(1), + }, + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return validators and next key (static call allowed)", + fields: fields{ + stakingQuerier: &TestStakingQuerier{ + ValidatorsResponse: validatorsResponse, + }, + }, + args: args{ + status: "BOND_STATUS_BONDED", + key: []byte{}, + readOnly: true, + }, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields.stakingQuerier, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).ValidatorsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args.status, tt.args.key) + require.NoError(t, err) + + // Caller and callingContract are irrelevant for validators (query-only). + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.args.value, nil, tt.args.readOnly, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + if tt.wantErrMsg != "" { + require.Contains(t, tt.wantErrMsg, tt.wantErrMsg) + } + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +// Helper function to create a test validator +func createTestValidator() stakingtypes.Validator { + return stakingtypes.Validator{ + OperatorAddress: "seivaloper1validator", + ConsensusPubkey: &codectypes.Any{Value: []byte("pubkey-bytes")}, + Jailed: false, + Status: stakingtypes.Bonded, + Tokens: sdk.NewInt(1000), + DelegatorShares: sdk.NewDec(1000), + Description: stakingtypes.NewDescription( + "moniker", + "identity", + "website", + "security", + "details", + ), + UnbondingHeight: 10, + UnbondingTime: time.Unix(1234, 0), + Commission: stakingtypes.Commission{ + CommissionRates: stakingtypes.CommissionRates{ + Rate: sdk.NewDecWithPrec(10, 2), + MaxRate: sdk.NewDecWithPrec(20, 2), + MaxChangeRate: sdk.NewDecWithPrec(1, 2), + }, + UpdateTime: time.Unix(5678, 0), + }, + MinSelfDelegation: sdk.NewInt(5), + } +} + +func TestPrecompile_Run_Validator(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + validatorMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).ValidatorID) + + val := createTestValidator() + validatorResponse := &stakingtypes.QueryValidatorResponse{ + Validator: val, + } + + expected := staking.Validator{ + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + } + + happyPathPackedOutput, _ := validatorMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + ValidatorResponse: validatorResponse, + }, + args: []interface{}{val.OperatorAddress}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return validator (static call allowed)", + fields: &TestStakingQuerier{ + ValidatorResponse: validatorResponse, + }, + args: []interface{}{val.OperatorAddress}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).ValidatorID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_ValidatorDelegations(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + validatorDelegationsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).ValidatorDelegationsID) + + callerSeiAddress, _ := testkeeper.MockAddressPair() + validatorAddress := "seivaloper134ykhqrkyda72uq7f463ne77e4tn99steprmz7" + shares := 100 + delegationResponse := &stakingtypes.DelegationResponse{ + Delegation: stakingtypes.Delegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Shares: sdk.NewDec(int64(shares)), + }, + Balance: sdk.NewCoin("usei", sdk.NewInt(int64(shares))), + } + + nextKey := []byte("next-key") + validatorDelegationsResponse := &stakingtypes.QueryValidatorDelegationsResponse{ + DelegationResponses: []stakingtypes.DelegationResponse{*delegationResponse}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + hundredSharesValue := new(big.Int) + hundredSharesValue.SetString("100000000000000000000", 10) + expected := staking.DelegationsResponse{ + Delegations: []staking.Delegation{ + { + Balance: staking.Balance{ + Amount: big.NewInt(int64(shares)), + Denom: "usei", + }, + Delegation: staking.DelegationDetails{ + DelegatorAddress: callerSeiAddress.String(), + Shares: hundredSharesValue, + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: validatorAddress, + }, + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := validatorDelegationsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + ValidatorDelegationsResponse: validatorDelegationsResponse, + }, + args: []interface{}{validatorAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return validator delegations (static call allowed)", + fields: &TestStakingQuerier{ + ValidatorDelegationsResponse: validatorDelegationsResponse, + }, + args: []interface{}{validatorAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).ValidatorDelegationsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_ValidatorUnbondingDelegations(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + validatorUnbondingDelegationsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).ValidatorUnbondingDelegationsID) + + callerSeiAddress, _ := testkeeper.MockAddressPair() + validatorAddress := "seivaloper134ykhqrkyda72uq7f463ne77e4tn99steprmz7" + unbondingDelegation := stakingtypes.UnbondingDelegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []stakingtypes.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: time.Unix(2000, 0), + InitialBalance: sdk.NewInt(50), + Balance: sdk.NewInt(40), + }, + }, + } + + nextKey := []byte("next-key") + validatorUnbondingDelegationsResponse := &stakingtypes.QueryValidatorUnbondingDelegationsResponse{ + UnbondingResponses: []stakingtypes.UnbondingDelegation{unbondingDelegation}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + expected := staking.UnbondingDelegationsResponse{ + UnbondingDelegations: []staking.UnbondingDelegation{ + { + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []staking.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: 2000, + InitialBalance: "50", + Balance: "40", + }, + }, + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := validatorUnbondingDelegationsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + ValidatorUnbondingDelegationsResponse: validatorUnbondingDelegationsResponse, + }, + args: []interface{}{validatorAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return validator unbonding delegations (static call allowed)", + fields: &TestStakingQuerier{ + ValidatorUnbondingDelegationsResponse: validatorUnbondingDelegationsResponse, + }, + args: []interface{}{validatorAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).ValidatorUnbondingDelegationsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_UnbondingDelegation(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + unbondingDelegationMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).UnbondingDelegationID) + + callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() + validatorAddress := "seivaloper134ykhqrkyda72uq7f463ne77e4tn99steprmz7" + unbondingDelegation := stakingtypes.UnbondingDelegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []stakingtypes.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: time.Unix(2000, 0), + InitialBalance: sdk.NewInt(50), + Balance: sdk.NewInt(40), + }, + }, + } + + unbondingDelegationResponse := &stakingtypes.QueryUnbondingDelegationResponse{ + Unbond: unbondingDelegation, + } + + expected := staking.UnbondingDelegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []staking.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: 2000, + InitialBalance: "50", + Balance: "40", + }, + }, + } + + happyPathPackedOutput, _ := unbondingDelegationMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + UnbondingDelegationResponse: unbondingDelegationResponse, + }, + args: []interface{}{callerEvmAddress, validatorAddress}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return unbonding delegation (static call allowed)", + fields: &TestStakingQuerier{ + UnbondingDelegationResponse: unbondingDelegationResponse, + }, + args: []interface{}{callerEvmAddress, validatorAddress}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).UnbondingDelegationID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_DelegatorDelegations(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + delegatorDelegationsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).DelegatorDelegationsID) + + callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() + validatorAddress := "seivaloper134ykhqrkyda72uq7f463ne77e4tn99steprmz7" + shares := 100 + delegationResponse := &stakingtypes.DelegationResponse{ + Delegation: stakingtypes.Delegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Shares: sdk.NewDec(int64(shares)), + }, + Balance: sdk.NewCoin("usei", sdk.NewInt(int64(shares))), + } + + nextKey := []byte("next-key") + delegatorDelegationsResponse := &stakingtypes.QueryDelegatorDelegationsResponse{ + DelegationResponses: []stakingtypes.DelegationResponse{*delegationResponse}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + hundredSharesValue := new(big.Int) + hundredSharesValue.SetString("100000000000000000000", 10) + expected := staking.DelegationsResponse{ + Delegations: []staking.Delegation{ + { + Balance: staking.Balance{ + Amount: big.NewInt(int64(shares)), + Denom: "usei", + }, + Delegation: staking.DelegationDetails{ + DelegatorAddress: callerSeiAddress.String(), + Shares: hundredSharesValue, + Decimals: big.NewInt(sdk.Precision), + ValidatorAddress: validatorAddress, + }, + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := delegatorDelegationsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + DelegatorDelegationsResponse: delegatorDelegationsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return delegator delegations (static call allowed)", + fields: &TestStakingQuerier{ + DelegatorDelegationsResponse: delegatorDelegationsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegatorDelegationsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_DelegatorValidator(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + delegatorValidatorMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).DelegatorValidatorID) + + callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() + val := createTestValidator() + validatorResponse := &stakingtypes.QueryDelegatorValidatorResponse{ + Validator: val, + } + + expected := staking.Validator{ + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + } + + happyPathPackedOutput, _ := delegatorValidatorMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + DelegatorValidatorResponse: validatorResponse, + }, + args: []interface{}{callerEvmAddress, val.OperatorAddress}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return delegator validator (static call allowed)", + fields: &TestStakingQuerier{ + DelegatorValidatorResponse: validatorResponse, + }, + args: []interface{}{callerEvmAddress, val.OperatorAddress}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegatorValidatorID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_DelegatorUnbondingDelegations(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + delegatorUnbondingDelegationsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).DelegatorUnbondingDelegationsID) + + callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() + validatorAddress := "seivaloper134ykhqrkyda72uq7f463ne77e4tn99steprmz7" + unbondingDelegation := stakingtypes.UnbondingDelegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []stakingtypes.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: time.Unix(2000, 0), + InitialBalance: sdk.NewInt(50), + Balance: sdk.NewInt(40), + }, + }, + } + + nextKey := []byte("next-key") + delegatorUnbondingDelegationsResponse := &stakingtypes.QueryDelegatorUnbondingDelegationsResponse{ + UnbondingResponses: []stakingtypes.UnbondingDelegation{unbondingDelegation}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + expected := staking.UnbondingDelegationsResponse{ + UnbondingDelegations: []staking.UnbondingDelegation{ + { + DelegatorAddress: callerSeiAddress.String(), + ValidatorAddress: validatorAddress, + Entries: []staking.UnbondingDelegationEntry{ + { + CreationHeight: 100, + CompletionTime: 2000, + InitialBalance: "50", + Balance: "40", + }, + }, + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := delegatorUnbondingDelegationsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + DelegatorUnbondingDelegationsResponse: delegatorUnbondingDelegationsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return delegator unbonding delegations (static call allowed)", + fields: &TestStakingQuerier{ + DelegatorUnbondingDelegationsResponse: delegatorUnbondingDelegationsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegatorUnbondingDelegationsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_Redelegations(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + redelegationsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).RedelegationsID) + + callerSeiAddress, _ := testkeeper.MockAddressPair() + srcValidatorAddress := "seivaloper1src" + dstValidatorAddress := "seivaloper1dst" + redelegation := stakingtypes.Redelegation{ + DelegatorAddress: callerSeiAddress.String(), + ValidatorSrcAddress: srcValidatorAddress, + ValidatorDstAddress: dstValidatorAddress, + Entries: []stakingtypes.RedelegationEntry{ + { + CreationHeight: 100, + CompletionTime: time.Unix(2000, 0), + InitialBalance: sdk.NewInt(50), + SharesDst: sdk.NewDec(40), + }, + }, + } + + redelegationEntryResponse := stakingtypes.RedelegationEntryResponse{ + RedelegationEntry: redelegation.Entries[0], + Balance: sdk.NewInt(40), + } + + nextKey := []byte("next-key") + redelegationsResponse := &stakingtypes.QueryRedelegationsResponse{ + RedelegationResponses: []stakingtypes.RedelegationResponse{ + { + Redelegation: redelegation, + Entries: []stakingtypes.RedelegationEntryResponse{redelegationEntryResponse}, + }, + }, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + expected := staking.RedelegationsResponse{ + Redelegations: []staking.Redelegation{ + { + DelegatorAddress: callerSeiAddress.String(), + ValidatorSrcAddress: srcValidatorAddress, + ValidatorDstAddress: dstValidatorAddress, + Entries: []staking.RedelegationEntry{ + { + CreationHeight: 100, + CompletionTime: 2000, + InitialBalance: "50", + SharesDst: "40", + }, + }, + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := redelegationsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + RedelegationsResponse: redelegationsResponse, + }, + args: []interface{}{callerSeiAddress.String(), srcValidatorAddress, dstValidatorAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return redelegations (static call allowed)", + fields: &TestStakingQuerier{ + RedelegationsResponse: redelegationsResponse, + }, + args: []interface{}{callerSeiAddress.String(), srcValidatorAddress, dstValidatorAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).RedelegationsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_DelegatorValidators(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + delegatorValidatorsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).DelegatorValidatorsID) + + callerSeiAddress, callerEvmAddress := testkeeper.MockAddressPair() + val := createTestValidator() + nextKey := []byte("next-key") + delegatorValidatorsResponse := &stakingtypes.QueryDelegatorValidatorsResponse{ + Validators: []stakingtypes.Validator{val}, + Pagination: &query.PageResponse{NextKey: nextKey}, + } + + expected := staking.ValidatorsResponse{ + Validators: []staking.Validator{ + { + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + }, + }, + NextKey: nextKey, + } + + happyPathPackedOutput, _ := delegatorValidatorsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ + { + name: "fails if value passed", + fields: &TestStakingQuerier{ + DelegatorValidatorsResponse: delegatorValidatorsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + value: big.NewInt(1), + wantErr: true, + wantErrMsg: "sending funds to a non-payable function", + }, + { + name: "should return delegator validators (static call allowed)", + fields: &TestStakingQuerier{ + DelegatorValidatorsResponse: delegatorValidatorsResponse, + }, + args: []interface{}{callerEvmAddress, []byte{}}, + wantRet: happyPathPackedOutput, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegatorValidatorsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_HistoricalInfo(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + historicalInfoMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).HistoricalInfoID) + + val := createTestValidator() + historicalInfo := stakingtypes.HistoricalInfo{ + Header: tmtypes.Header{Height: 100}, + Valset: []stakingtypes.Validator{val}, + } + + historicalInfoResponse := &stakingtypes.QueryHistoricalInfoResponse{ + Hist: &historicalInfo, } - type args struct { - evm *vm.EVM - delegatorAddress common.Address - validatorAddress string - caller common.Address - callingContract common.Address - value *big.Int - readOnly bool - isFromDelegateCall bool + + expected := staking.HistoricalInfo{ + Height: 100, + Validators: []staking.Validator{ + { + OperatorAddress: val.OperatorAddress, + ConsensusPubkey: val.ConsensusPubkey.Value, + Jailed: val.Jailed, + Status: int32(val.Status), + Tokens: val.Tokens.String(), + DelegatorShares: val.DelegatorShares.String(), + Description: val.Description.String(), + UnbondingHeight: val.UnbondingHeight, + UnbondingTime: val.UnbondingTime.Unix(), + CommissionRate: val.Commission.Rate.String(), + CommissionMaxRate: val.Commission.MaxRate.String(), + CommissionMaxChangeRate: val.Commission.MaxChangeRate.String(), + CommissionUpdateTime: val.Commission.UpdateTime.Unix(), + MinSelfDelegation: val.MinSelfDelegation.String(), + }, + }, } + happyPathPackedOutput, _ := historicalInfoMethod.Outputs.Pack(expected) + tests := []struct { name string - fields fields - args args + fields utils.StakingQuerier + args []interface{} + value *big.Int wantRet []byte wantErr bool wantErrMsg string }{ { name: "fails if value passed", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, - }, - args: args{ - delegatorAddress: callerEvmAddress, - validatorAddress: validatorAddress, - value: big.NewInt(100), + fields: &TestStakingQuerier{ + HistoricalInfoResponse: historicalInfoResponse, }, - wantRet: happyPathPackedOutput, + args: []interface{}{int64(100)}, + value: big.NewInt(1), wantErr: true, wantErrMsg: "sending funds to a non-payable function", }, { - name: "fails if caller != callingContract", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, - }, - args: args{ - caller: callerEvmAddress, - callingContract: contractEvmAddress, - delegatorAddress: callerEvmAddress, - validatorAddress: validatorAddress, - value: big.NewInt(100), - isFromDelegateCall: true, + name: "should return historical info (static call allowed)", + fields: &TestStakingQuerier{ + HistoricalInfoResponse: historicalInfoResponse, }, - wantErr: true, - wantErrMsg: "cannot delegatecall staking", + args: []interface{}{int64(100)}, + wantRet: happyPathPackedOutput, + wantErr: false, }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).HistoricalInfoID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_Pool(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + poolMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).PoolID) + + pool := stakingtypes.Pool{ + NotBondedTokens: sdk.NewInt(1000), + BondedTokens: sdk.NewInt(2000), + } + + poolResponse := &stakingtypes.QueryPoolResponse{ + Pool: pool, + } + + expected := staking.Pool{ + NotBondedTokens: pool.NotBondedTokens.String(), + BondedTokens: pool.BondedTokens.String(), + } + + happyPathPackedOutput, _ := poolMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ { - name: "fails if delegator address unassociated", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, - }, - args: args{ - caller: callerEvmAddress, - callingContract: callerEvmAddress, - delegatorAddress: unassociatedEvmAddress, - validatorAddress: validatorAddress, + name: "fails if value passed", + fields: &TestStakingQuerier{ + PoolResponse: poolResponse, }, + args: []interface{}{}, + value: big.NewInt(1), wantErr: true, - wantErrMsg: fmt.Sprintf("address %s is not linked", unassociatedEvmAddress.String()), + wantErrMsg: "sending funds to a non-payable function", }, { - name: "fails if delegator address is invalid", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, + name: "should return pool (static call allowed)", + fields: &TestStakingQuerier{ + PoolResponse: poolResponse, }, - args: args{ - delegatorAddress: common.Address{}, - validatorAddress: validatorAddress, - caller: callerEvmAddress, - callingContract: callerEvmAddress, - }, - wantErr: true, - wantErrMsg: "invalid addr", + args: []interface{}{}, + wantRet: happyPathPackedOutput, + wantErr: false, }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + } + p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ + StakingQuerier: tt.fields, + EVMKeeper: k, + }) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).PoolID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) + if (err != nil) != tt.wantErr { + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) + } + if err != nil { + require.Equal(t, vm.ErrExecutionReverted, err) + require.Nil(t, gotRet) + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { + t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) + } + }) + } +} + +func TestPrecompile_Run_Params(t *testing.T) { + pre, _ := staking.NewPrecompile(&utils.EmptyKeepers{}) + paramsMethod, _ := pre.ABI.MethodById(pre.GetExecutor().(*staking.PrecompileExecutor).ParamsID) + + params := stakingtypes.Params{ + UnbondingTime: time.Duration(1000000000000), // 1000 seconds in nanoseconds + MaxValidators: 100, + MaxEntries: 7, + HistoricalEntries: 10000, + BondDenom: "usei", + MinCommissionRate: sdk.NewDecWithPrec(5, 2), + MaxVotingPowerRatio: sdk.NewDecWithPrec(30, 2), + MaxVotingPowerEnforcementThreshold: sdk.NewInt(1000000), + } + + paramsResponse := &stakingtypes.QueryParamsResponse{ + Params: params, + } + + expected := staking.Params{ + UnbondingTime: uint64(params.UnbondingTime.Seconds()), + MaxValidators: params.MaxValidators, + MaxEntries: params.MaxEntries, + HistoricalEntries: params.HistoricalEntries, + BondDenom: params.BondDenom, + MinCommissionRate: params.MinCommissionRate.String(), + MaxVotingPowerRatio: params.MaxVotingPowerRatio.String(), + MaxVotingPowerEnforcementThreshold: params.MaxVotingPowerEnforcementThreshold.String(), + } + + happyPathPackedOutput, _ := paramsMethod.Outputs.Pack(expected) + + tests := []struct { + name string + fields utils.StakingQuerier + args []interface{} + value *big.Int + wantRet []byte + wantErr bool + wantErrMsg string + }{ { - name: "should return error if delegation not found", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Err: fmt.Errorf("delegation with delegator %s not found for validator", callerSeiAddress.String()), - }, - }, - args: args{ - delegatorAddress: callerEvmAddress, - validatorAddress: validatorAddress, - caller: callerEvmAddress, - callingContract: callerEvmAddress, + name: "fails if value passed", + fields: &TestStakingQuerier{ + ParamsResponse: paramsResponse, }, + args: []interface{}{}, + value: big.NewInt(1), wantErr: true, - wantErrMsg: fmt.Sprintf("delegation with delegator %s not found for validator", callerSeiAddress.String()), - }, - { - name: "should return delegation details", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, - }, - args: args{ - delegatorAddress: callerEvmAddress, - validatorAddress: validatorAddress, - caller: callerEvmAddress, - callingContract: callerEvmAddress, - }, - wantRet: happyPathPackedOutput, - wantErr: false, + wantErrMsg: "sending funds to a non-payable function", }, { - name: "should allow static call", - fields: fields{ - stakingQuerier: &TestStakingQuerier{ - Response: delegationResponse, - }, - }, - args: args{ - delegatorAddress: callerEvmAddress, - validatorAddress: validatorAddress, - caller: callerEvmAddress, - callingContract: callerEvmAddress, - readOnly: true, + name: "should return params (static call allowed)", + fields: &TestStakingQuerier{ + ParamsResponse: paramsResponse, }, + args: []interface{}{}, wantRet: happyPathPackedOutput, wantErr: false, }, } + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { testApp := testkeeper.EVMTestApp ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) k := &testApp.EvmKeeper - k.SetAddressMapping(ctx, callerSeiAddress, callerEvmAddress) stateDb := state.NewDBImpl(ctx, k, true) evm := vm.EVM{ - StateDB: stateDb, - TxContext: vm.TxContext{Origin: callerEvmAddress}, + StateDB: stateDb, } p, _ := staking.NewPrecompile(&app.PrecompileKeepers{ - StakingKeeper: tt.fields.stakingKeeper, - StakingQuerier: tt.fields.stakingQuerier, + StakingQuerier: tt.fields, EVMKeeper: k, }) - delegation, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).DelegationID) - require.Nil(t, err) - inputs, err := delegation.Inputs.Pack(tt.args.delegatorAddress, tt.args.validatorAddress) - require.Nil(t, err) - gotRet, err := p.Run(&evm, tt.args.caller, tt.args.callingContract, append(p.GetExecutor().(*staking.PrecompileExecutor).DelegationID, inputs...), tt.args.value, tt.args.readOnly, tt.args.isFromDelegateCall, nil) + method, err := p.ABI.MethodById(p.GetExecutor().(*staking.PrecompileExecutor).ParamsID) + require.NoError(t, err) + + inputs, err := method.Inputs.Pack(tt.args...) + require.NoError(t, err) + + gotRet, _, err := p.RunAndCalculateGas(&evm, common.Address{}, common.Address{}, append(method.ID, inputs...), math.MaxUint64, tt.value, nil, true, false) if (err != nil) != tt.wantErr { - t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) - return + t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) } if err != nil { require.Equal(t, vm.ErrExecutionReverted, err) require.Nil(t, gotRet) - } else if !reflect.DeepEqual(gotRet, tt.wantRet) { + return + } + if !reflect.DeepEqual(gotRet, tt.wantRet) { t.Errorf("Run() gotRet = %v, want %v", gotRet, tt.wantRet) } }) @@ -926,81 +2417,6 @@ func TestEditValidator(t *testing.T) { require.Equal(t, validator.ConsensusPubkey, updatedValidator.ConsensusPubkey, "Consensus pubkey should remain the same") } -func TestStakingPrecompile_RequiredGas(t *testing.T) { - pre, err := staking.NewPrecompile(&utils.EmptyKeepers{}) - require.NoError(t, err) - - executor := pre.GetExecutor().(*staking.PrecompileExecutor) - - // Test gas costs for all methods - testCases := []struct { - name string - methodID []byte - methodName string - inputSize int - expectedGas uint64 - }{ - { - name: "delegate method", - methodID: executor.DelegateID, - methodName: staking.DelegateMethod, - expectedGas: 50000, - }, - { - name: "redelegate method", - methodID: executor.RedelegateID, - methodName: staking.RedelegateMethod, - expectedGas: 70000, - }, - { - name: "undelegate method", - methodID: executor.UndelegateID, - methodName: staking.UndelegateMethod, - expectedGas: 50000, - }, - { - name: "createValidator method", - methodID: executor.CreateValidatorID, - methodName: staking.CreateValidatorMethod, - expectedGas: 100000, - }, - { - name: "editValidator method", - methodID: executor.EditValidatorID, - methodName: "editValidator", - expectedGas: 100000, - }, - { - name: "delegation method (query)", - methodID: executor.DelegationID, - methodName: staking.DelegationMethod, - inputSize: 100, - expectedGas: 1300, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - // Get the method from ABI - method, err := pre.ABI.MethodById(tc.methodID) - require.NoError(t, err, "Should be able to find method by ID") - require.Equal(t, tc.methodName, method.Name, "Method name should match") - - // Create mock input (method ID + some data) - input := make([]byte, 4+tc.inputSize) // method ID (4 bytes) + input data - copy(input[:4], tc.methodID) - - // Test RequiredGas - gasRequired := executor.RequiredGas(input[4:], method) - - // Verify gas - require.Equal(t, tc.expectedGas, gasRequired, - "Gas should be at least %d, got %d", tc.expectedGas, gasRequired) - - }) - } -} - func TestStakingPrecompileDelegateCallPrevention(t *testing.T) { testApp := testkeeper.EVMTestApp ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) @@ -1076,7 +2492,7 @@ func TestStakingPrecompileDelegateCallPrevention(t *testing.T) { StateDB: state.NewDBImpl(ctx, k, false), } - _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, tc.args, tc.value, false, evm, nil) + _, _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, tc.args, tc.value, false, evm, math.MaxUint64, nil) require.Error(t, err) require.Contains(t, err.Error(), "cannot delegatecall staking") }) @@ -1156,7 +2572,7 @@ func TestStakingPrecompileStaticCallPrevention(t *testing.T) { } // Test with readOnly = true (staticcall) - _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, tc.args, tc.value, true, evm, nil) + _, _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, tc.args, tc.value, true, evm, math.MaxUint64, nil) require.Error(t, err) require.Contains(t, err.Error(), "cannot call staking precompile from staticcall") }) @@ -1182,7 +2598,7 @@ func TestStakingPrecompileStaticCallPrevention(t *testing.T) { // Should succeed with readOnly = true for query method (even if no delegation exists) // The important thing is that the static call is allowed - _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, args, nil, true, evm, nil) + _, _, err := precompile.GetExecutor().(*staking.PrecompileExecutor).Execute(ctx, &method, evmAddr, evmAddr, args, nil, true, evm, math.MaxUint64, nil) // We don't check the error because the delegation might not exist // We're just testing that static calls are allowed for query methods _ = err diff --git a/precompiles/staking/versions b/precompiles/staking/versions index 538d4ffc28..5106fe993b 100644 --- a/precompiles/staking/versions +++ b/precompiles/staking/versions @@ -6,3 +6,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/precompiles/utils/expected_keepers.go b/precompiles/utils/expected_keepers.go index a9fd7412c3..9ace6c7704 100644 --- a/precompiles/utils/expected_keepers.go +++ b/precompiles/utils/expected_keepers.go @@ -149,6 +149,19 @@ type StakingKeeper interface { type StakingQuerier interface { Delegation(c context.Context, req *stakingtypes.QueryDelegationRequest) (*stakingtypes.QueryDelegationResponse, error) + Validators(c context.Context, req *stakingtypes.QueryValidatorsRequest) (*stakingtypes.QueryValidatorsResponse, error) + Validator(c context.Context, req *stakingtypes.QueryValidatorRequest) (*stakingtypes.QueryValidatorResponse, error) + ValidatorDelegations(c context.Context, req *stakingtypes.QueryValidatorDelegationsRequest) (*stakingtypes.QueryValidatorDelegationsResponse, error) + ValidatorUnbondingDelegations(c context.Context, req *stakingtypes.QueryValidatorUnbondingDelegationsRequest) (*stakingtypes.QueryValidatorUnbondingDelegationsResponse, error) + UnbondingDelegation(c context.Context, req *stakingtypes.QueryUnbondingDelegationRequest) (*stakingtypes.QueryUnbondingDelegationResponse, error) + DelegatorDelegations(c context.Context, req *stakingtypes.QueryDelegatorDelegationsRequest) (*stakingtypes.QueryDelegatorDelegationsResponse, error) + DelegatorValidator(c context.Context, req *stakingtypes.QueryDelegatorValidatorRequest) (*stakingtypes.QueryDelegatorValidatorResponse, error) + DelegatorUnbondingDelegations(c context.Context, req *stakingtypes.QueryDelegatorUnbondingDelegationsRequest) (*stakingtypes.QueryDelegatorUnbondingDelegationsResponse, error) + Redelegations(c context.Context, req *stakingtypes.QueryRedelegationsRequest) (*stakingtypes.QueryRedelegationsResponse, error) + DelegatorValidators(c context.Context, req *stakingtypes.QueryDelegatorValidatorsRequest) (*stakingtypes.QueryDelegatorValidatorsResponse, error) + HistoricalInfo(c context.Context, req *stakingtypes.QueryHistoricalInfoRequest) (*stakingtypes.QueryHistoricalInfoResponse, error) + Pool(c context.Context, req *stakingtypes.QueryPoolRequest) (*stakingtypes.QueryPoolResponse, error) + Params(c context.Context, req *stakingtypes.QueryParamsRequest) (*stakingtypes.QueryParamsResponse, error) } type GovKeeper interface { diff --git a/precompiles/wasmd/legacy/v620/abi.json b/precompiles/wasmd/legacy/v620/abi.json new file mode 100644 index 0000000000..c5e5b1b3f6 --- /dev/null +++ b/precompiles/wasmd/legacy/v620/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"bytes","name":"coins","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"bytes","name":"coins","type":"bytes"}],"internalType":"struct IWasmd.ExecuteMsg[]","name":"executeMsgs","type":"tuple[]"}],"name":"execute_batch","outputs":[{"internalType":"bytes[]","name":"responses","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"codeID","type":"uint64"},{"internalType":"string","name":"admin","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bytes","name":"coins","type":"bytes"}],"name":"instantiate","outputs":[{"internalType":"string","name":"contractAddr","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"req","type":"bytes"}],"name":"query","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/wasmd/legacy/v620/wasmd.go b/precompiles/wasmd/legacy/v620/wasmd.go new file mode 100644 index 0000000000..92783754f5 --- /dev/null +++ b/precompiles/wasmd/legacy/v620/wasmd.go @@ -0,0 +1,468 @@ +package v620 + +import ( + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v620" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + InstantiateMethod = "instantiate" + ExecuteMethod = "execute" + ExecuteBatchMethod = "execute_batch" + QueryMethod = "query" +) + +const WasmdAddress = "0x0000000000000000000000000000000000001002" +const PrecompileName = "wasmd" + +var Address = common.HexToAddress(WasmdAddress) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + wasmdKeeper utils.WasmdKeeper + wasmdViewKeeper utils.WasmdViewKeeper + address common.Address + + InstantiateID []byte + ExecuteID []byte + ExecuteBatchID []byte + QueryID []byte +} + +type ExecuteMsg struct { + ContractAddress string `json:"contractAddress"` + Msg []byte `json:"msg"` + Coins []byte `json:"coins"` +} + +func GetABI() abi.ABI { + return pcommon.MustGetABI(f, "abi.json") +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := GetABI() + + executor := &PrecompileExecutor{ + wasmdKeeper: keepers.WasmdK(), + wasmdViewKeeper: keepers.WasmdVK(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: Address, + } + + for name, m := range newAbi.Methods { + switch name { + case InstantiateMethod: + executor.InstantiateID = m.ID + case ExecuteMethod: + executor.ExecuteID = m.ID + case ExecuteBatchMethod: + executor.ExecuteBatchID = m.ID + case QueryMethod: + executor.QueryID = m.ID + } + } + return pcommon.NewDynamicGasPrecompile(newAbi, executor, Address, PrecompileName), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if method.Name != QueryMethod && !ctx.IsEVM() { + return nil, 0, errors.New("sei does not support CW->EVM->CW call pattern") + } + switch method.Name { + case InstantiateMethod: + return p.instantiate(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case ExecuteMethod: + return p.execute(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case ExecuteBatchMethod: + return p.executeBatch(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case QueryMethod: + return p.query(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) instantiate(ctx sdk.Context, method *abi.Method, caller common.Address, _ common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call instantiate from staticcall") + return + } + if err := pcommon.ValidateArgsLength(args, 5); err != nil { + rerr = err + return + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + rerr = errors.New("cannot delegatecall instantiate") + return + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + codeID := args[0].(uint64) + creatorAddr, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + var adminAddr sdk.AccAddress + adminAddrStr := args[1].(string) + if len(adminAddrStr) > 0 { + adminAddrDecoded, err := sdk.AccAddressFromBech32(adminAddrStr) + if err != nil { + rerr = err + return + } + adminAddr = adminAddrDecoded + } + msg := args[2].([]byte) + label := args[3].(string) + coins := sdk.NewCoins() + coinsBz := args[4].([]byte) + + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + coinsValue := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + if (value == nil && coinsValue.Sign() == 1) || (value != nil && coinsValue.Cmp(value) != 0) { + rerr = errors.New("coin amount must equal value specified") + return + } + + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgInstantiate := wasmtypes.MsgInstantiateContract{ + Sender: creatorAddr.String(), + CodeID: codeID, + Label: label, + Funds: coins, + Msg: msg, + Admin: adminAddrStr, + } + + if err := msgInstantiate.ValidateBasic(); err != nil { + rerr = err + return + } + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if value != nil && !useiAmt.IsZero() { + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), creatorAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + + addr, data, err := p.wasmdKeeper.Instantiate(ctx, codeID, creatorAddr, adminAddr, msg, label, coins) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(addr.String(), data) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) executeBatch(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call execute from staticcall") + return + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + + executeMsgs := args[0].([]struct { + ContractAddress string `json:"contractAddress"` + Msg []byte `json:"msg"` + Coins []byte `json:"coins"` + }) + + responses := make([][]byte, 0, len(executeMsgs)) + + // validate coins add up to value + validateValue := big.NewInt(0) + for i := 0; i < len(executeMsgs); i++ { + executeMsg := ExecuteMsg(executeMsgs[i]) + coinsBz := executeMsg.Coins + coins := sdk.NewCoins() + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + messageAmount := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + validateValue.Add(validateValue, messageAmount) + } + // if validateValue is greater than zero, then value must be provided, and they must be equal + if (value == nil && validateValue.Sign() == 1) || (value != nil && validateValue.Cmp(value) != 0) { + rerr = errors.New("sum of coin amounts must equal value specified") + return + } + // Copy to avoid modifying the original value + var valueCopy *big.Int + if value != nil { + valueCopy = new(big.Int).Set(value) + } else { + valueCopy = value + } + for i := 0; i < len(executeMsgs); i++ { + executeMsg := ExecuteMsg(executeMsgs[i]) + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + contractAddrStr := executeMsg.ContractAddress + if ctx.EVMPrecompileCalledFromDelegateCall() { + erc20pointer, _, erc20exists := p.evmKeeper.GetERC20CW20Pointer(ctx, contractAddrStr) + erc721pointer, _, erc721exists := p.evmKeeper.GetERC721CW721Pointer(ctx, contractAddrStr) + erc1155pointer, _, erc1155exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, contractAddrStr) + if (!erc20exists || erc20pointer.Cmp(callingContract) != 0) && (!erc721exists || erc721pointer.Cmp(callingContract) != 0) && (!erc1155exists || erc1155pointer.Cmp(callingContract) != 0) { + return nil, 0, fmt.Errorf("%s is not a pointer of %s", callingContract.Hex(), contractAddrStr) + } + } + + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + senderAddr, senderAssociated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !senderAssociated { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + msg := executeMsg.Msg + coinsBz := executeMsg.Coins + coins := sdk.NewCoins() + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if valueCopy != nil && !useiAmt.IsZero() { + // process coin amount from the value provided + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + valueCopy.Sub(valueCopy, useiAmtAsWei) + if valueCopy.Sign() == -1 { + rerr = errors.New("insufficient value provided for payment") + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgExecute := wasmtypes.MsgExecuteContract{ + Sender: senderAddr.String(), + Contract: contractAddr.String(), + Msg: msg, + Funds: coins, + } + if err := msgExecute.ValidateBasic(); err != nil { + rerr = err + return + } + + res, err := p.wasmdKeeper.Execute(ctx, contractAddr, senderAddr, msg, coins) + if err != nil { + rerr = err + return + } + responses = append(responses, res) + } + if valueCopy != nil && valueCopy.Sign() != 0 { + rerr = errors.New("value remaining after execution, must match provided amounts exactly") + return + } + ret, rerr = method.Outputs.Pack(responses) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call execute from staticcall") + return + } + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + rerr = err + return + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + contractAddrStr := args[0].(string) + if ctx.EVMPrecompileCalledFromDelegateCall() { + erc20pointer, _, erc20exists := p.evmKeeper.GetERC20CW20Pointer(ctx, contractAddrStr) + erc721pointer, _, erc721exists := p.evmKeeper.GetERC721CW721Pointer(ctx, contractAddrStr) + erc1155pointer, _, erc1155exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, contractAddrStr) + if (!erc20exists || erc20pointer.Cmp(callingContract) != 0) && (!erc721exists || erc721pointer.Cmp(callingContract) != 0) && (!erc1155exists || erc1155pointer.Cmp(callingContract) != 0) { + return nil, 0, fmt.Errorf("%s is not a pointer of %s", callingContract.Hex(), contractAddrStr) + } + } + // addresses will be sent in Sei format + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + senderAddr, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + msg := args[1].([]byte) + coins := sdk.NewCoins() + coinsBz := args[2].([]byte) + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + coinsValue := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + if (value == nil && coinsValue.Sign() == 1) || (value != nil && coinsValue.Cmp(value) != 0) { + rerr = errors.New("coin amount must equal value specified") + return + } + + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgExecute := wasmtypes.MsgExecuteContract{ + Sender: senderAddr.String(), + Contract: contractAddr.String(), + Msg: msg, + Funds: coins, + } + + if err := msgExecute.ValidateBasic(); err != nil { + rerr = err + return + } + + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if value != nil && !useiAmt.IsZero() { + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + res, err := p.wasmdKeeper.Execute(ctx, contractAddr, senderAddr, msg, coins) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(res) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) query(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if err := pcommon.ValidateNonPayable(value); err != nil { + rerr = err + return + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + rerr = err + return + } + + contractAddrStr := args[0].(string) + // addresses will be sent in Sei format + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + req := args[1].([]byte) + + rawContractMessage := wasmtypes.RawContractMessage(req) + if err := rawContractMessage.ValidateBasic(); err != nil { + rerr = err + return + } + res, err := p.wasmdViewKeeper.QuerySmartSafe(ctx, contractAddr, req) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(res) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func IsWasmdCall(to *common.Address) bool { + return to != nil && (to.Cmp(Address) == 0) +} diff --git a/precompiles/wasmd/legacy/v630/abi.json b/precompiles/wasmd/legacy/v630/abi.json new file mode 100644 index 0000000000..c5e5b1b3f6 --- /dev/null +++ b/precompiles/wasmd/legacy/v630/abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"bytes","name":"coins","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"bytes","name":"coins","type":"bytes"}],"internalType":"struct IWasmd.ExecuteMsg[]","name":"executeMsgs","type":"tuple[]"}],"name":"execute_batch","outputs":[{"internalType":"bytes[]","name":"responses","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"codeID","type":"uint64"},{"internalType":"string","name":"admin","type":"string"},{"internalType":"bytes","name":"msg","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bytes","name":"coins","type":"bytes"}],"name":"instantiate","outputs":[{"internalType":"string","name":"contractAddr","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"contractAddress","type":"string"},{"internalType":"bytes","name":"req","type":"bytes"}],"name":"query","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/precompiles/wasmd/legacy/v630/wasmd.go b/precompiles/wasmd/legacy/v630/wasmd.go new file mode 100644 index 0000000000..6c5b312596 --- /dev/null +++ b/precompiles/wasmd/legacy/v630/wasmd.go @@ -0,0 +1,468 @@ +package v630 + +import ( + "embed" + "encoding/json" + "errors" + "fmt" + "math/big" + + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + + pcommon "github.com/sei-protocol/sei-chain/precompiles/common/legacy/v630" + "github.com/sei-protocol/sei-chain/precompiles/utils" + "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +const ( + InstantiateMethod = "instantiate" + ExecuteMethod = "execute" + ExecuteBatchMethod = "execute_batch" + QueryMethod = "query" +) + +const WasmdAddress = "0x0000000000000000000000000000000000001002" +const PrecompileName = "wasmd" + +var Address = common.HexToAddress(WasmdAddress) + +// Embed abi json file to the executable binary. Needed when importing as dependency. +// +//go:embed abi.json +var f embed.FS + +type PrecompileExecutor struct { + evmKeeper utils.EVMKeeper + bankKeeper utils.BankKeeper + wasmdKeeper utils.WasmdKeeper + wasmdViewKeeper utils.WasmdViewKeeper + address common.Address + + InstantiateID []byte + ExecuteID []byte + ExecuteBatchID []byte + QueryID []byte +} + +type ExecuteMsg struct { + ContractAddress string `json:"contractAddress"` + Msg []byte `json:"msg"` + Coins []byte `json:"coins"` +} + +func GetABI() abi.ABI { + return pcommon.MustGetABI(f, "abi.json") +} + +func NewPrecompile(keepers utils.Keepers) (*pcommon.DynamicGasPrecompile, error) { + newAbi := GetABI() + + executor := &PrecompileExecutor{ + wasmdKeeper: keepers.WasmdK(), + wasmdViewKeeper: keepers.WasmdVK(), + evmKeeper: keepers.EVMK(), + bankKeeper: keepers.BankK(), + address: Address, + } + + for name, m := range newAbi.Methods { + switch name { + case InstantiateMethod: + executor.InstantiateID = m.ID + case ExecuteMethod: + executor.ExecuteID = m.ID + case ExecuteBatchMethod: + executor.ExecuteBatchID = m.ID + case QueryMethod: + executor.QueryID = m.ID + } + } + return pcommon.NewDynamicGasPrecompile(newAbi, executor, Address, PrecompileName), nil +} + +func (p PrecompileExecutor) Execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, evm *vm.EVM, suppliedGas uint64, hooks *tracing.Hooks) (ret []byte, remainingGas uint64, err error) { + if method.Name != QueryMethod && !ctx.IsEVM() { + return nil, 0, errors.New("sei does not support CW->EVM->CW call pattern") + } + switch method.Name { + case InstantiateMethod: + return p.instantiate(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case ExecuteMethod: + return p.execute(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case ExecuteBatchMethod: + return p.executeBatch(ctx, method, caller, callingContract, args, value, readOnly, hooks, evm) + case QueryMethod: + return p.query(ctx, method, args, value) + } + return +} + +func (p PrecompileExecutor) EVMKeeper() utils.EVMKeeper { + return p.evmKeeper +} + +func (p PrecompileExecutor) instantiate(ctx sdk.Context, method *abi.Method, caller common.Address, _ common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call instantiate from staticcall") + return + } + if err := pcommon.ValidateArgsLength(args, 5); err != nil { + rerr = err + return + } + if ctx.EVMPrecompileCalledFromDelegateCall() { + rerr = errors.New("cannot delegatecall instantiate") + return + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + codeID := args[0].(uint64) + creatorAddr, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + var adminAddr sdk.AccAddress + adminAddrStr := args[1].(string) + if len(adminAddrStr) > 0 { + adminAddrDecoded, err := sdk.AccAddressFromBech32(adminAddrStr) + if err != nil { + rerr = err + return + } + adminAddr = adminAddrDecoded + } + msg := args[2].([]byte) + label := args[3].(string) + coins := sdk.NewCoins() + coinsBz := args[4].([]byte) + + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + coinsValue := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + if (value == nil && coinsValue.Sign() == 1) || (value != nil && coinsValue.Cmp(value) != 0) { + rerr = errors.New("coin amount must equal value specified") + return + } + + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgInstantiate := wasmtypes.MsgInstantiateContract{ + Sender: creatorAddr.String(), + CodeID: codeID, + Label: label, + Funds: coins, + Msg: msg, + Admin: adminAddrStr, + } + + if err := msgInstantiate.ValidateBasic(); err != nil { + rerr = err + return + } + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if value != nil && !useiAmt.IsZero() { + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), creatorAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + + addr, data, err := p.wasmdKeeper.Instantiate(ctx, codeID, creatorAddr, adminAddr, msg, label, coins) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(addr.String(), data) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) executeBatch(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call execute from staticcall") + return + } + + if err := pcommon.ValidateArgsLength(args, 1); err != nil { + rerr = err + return + } + + executeMsgs := args[0].([]struct { + ContractAddress string `json:"contractAddress"` + Msg []byte `json:"msg"` + Coins []byte `json:"coins"` + }) + + responses := make([][]byte, 0, len(executeMsgs)) + + // validate coins add up to value + validateValue := big.NewInt(0) + for i := 0; i < len(executeMsgs); i++ { + executeMsg := ExecuteMsg(executeMsgs[i]) + coinsBz := executeMsg.Coins + coins := sdk.NewCoins() + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + messageAmount := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + validateValue.Add(validateValue, messageAmount) + } + // if validateValue is greater than zero, then value must be provided, and they must be equal + if (value == nil && validateValue.Sign() == 1) || (value != nil && validateValue.Cmp(value) != 0) { + rerr = errors.New("sum of coin amounts must equal value specified") + return + } + // Copy to avoid modifying the original value + var valueCopy *big.Int + if value != nil { + valueCopy = new(big.Int).Set(value) + } else { + valueCopy = value + } + for i := 0; i < len(executeMsgs); i++ { + executeMsg := ExecuteMsg(executeMsgs[i]) + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + contractAddrStr := executeMsg.ContractAddress + if ctx.EVMPrecompileCalledFromDelegateCall() { + erc20pointer, _, erc20exists := p.evmKeeper.GetERC20CW20Pointer(ctx, contractAddrStr) + erc721pointer, _, erc721exists := p.evmKeeper.GetERC721CW721Pointer(ctx, contractAddrStr) + erc1155pointer, _, erc1155exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, contractAddrStr) + if (!erc20exists || erc20pointer.Cmp(callingContract) != 0) && (!erc721exists || erc721pointer.Cmp(callingContract) != 0) && (!erc1155exists || erc1155pointer.Cmp(callingContract) != 0) { + return nil, 0, fmt.Errorf("%s is not a pointer of %s", callingContract.Hex(), contractAddrStr) + } + } + + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + senderAddr, senderAssociated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !senderAssociated { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + msg := executeMsg.Msg + coinsBz := executeMsg.Coins + coins := sdk.NewCoins() + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if valueCopy != nil && !useiAmt.IsZero() { + // process coin amount from the value provided + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + valueCopy.Sub(valueCopy, useiAmtAsWei) + if valueCopy.Sign() == -1 { + rerr = errors.New("insufficient value provided for payment") + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgExecute := wasmtypes.MsgExecuteContract{ + Sender: senderAddr.String(), + Contract: contractAddr.String(), + Msg: msg, + Funds: coins, + } + if err := msgExecute.ValidateBasic(); err != nil { + rerr = err + return + } + + res, err := p.wasmdKeeper.Execute(ctx, contractAddr, senderAddr, msg, coins) + if err != nil { + rerr = err + return + } + responses = append(responses, res) + } + if valueCopy != nil && valueCopy.Sign() != 0 { + rerr = errors.New("value remaining after execution, must match provided amounts exactly") + return + } + ret, rerr = method.Outputs.Pack(responses) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) execute(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool, hooks *tracing.Hooks, evm *vm.EVM) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if readOnly { + rerr = errors.New("cannot call execute from staticcall") + return + } + if err := pcommon.ValidateArgsLength(args, 3); err != nil { + rerr = err + return + } + + // type assertion will always succeed because it's already validated in p.Prepare call in Run() + contractAddrStr := args[0].(string) + if ctx.EVMPrecompileCalledFromDelegateCall() { + erc20pointer, _, erc20exists := p.evmKeeper.GetERC20CW20Pointer(ctx, contractAddrStr) + erc721pointer, _, erc721exists := p.evmKeeper.GetERC721CW721Pointer(ctx, contractAddrStr) + erc1155pointer, _, erc1155exists := p.evmKeeper.GetERC1155CW1155Pointer(ctx, contractAddrStr) + if (!erc20exists || erc20pointer.Cmp(callingContract) != 0) && (!erc721exists || erc721pointer.Cmp(callingContract) != 0) && (!erc1155exists || erc1155pointer.Cmp(callingContract) != 0) { + return nil, 0, fmt.Errorf("%s is not a pointer of %s", callingContract.Hex(), contractAddrStr) + } + } + // addresses will be sent in Sei format + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + senderAddr, found := p.evmKeeper.GetSeiAddress(ctx, caller) + if !found { + rerr = types.NewAssociationMissingErr(caller.Hex()) + return + } + msg := args[1].([]byte) + coins := sdk.NewCoins() + coinsBz := args[2].([]byte) + if err := json.Unmarshal(coinsBz, &coins); err != nil { + rerr = err + return + } + coinsValue := coins.AmountOf(sdk.MustGetBaseDenom()).Mul(state.SdkUseiToSweiMultiplier).BigInt() + if (value == nil && coinsValue.Sign() == 1) || (value != nil && coinsValue.Cmp(value) != 0) { + rerr = errors.New("coin amount must equal value specified") + return + } + + // Run basic validation, can also just expose validateLabel and validate validateWasmCode in sei-wasmd + msgExecute := wasmtypes.MsgExecuteContract{ + Sender: senderAddr.String(), + Contract: contractAddr.String(), + Msg: msg, + Funds: coins, + } + + if err := msgExecute.ValidateBasic(); err != nil { + rerr = err + return + } + + useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) + if value != nil && !useiAmt.IsZero() { + useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() + coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderAddr, useiAmtAsWei, p.bankKeeper, p.evmKeeper, hooks, evm.GetDepth()) + if err != nil { + rerr = err + return + } + // sanity check coin amounts match + if !coin.Amount.Equal(useiAmt) { + rerr = errors.New("mismatch between coins and payment value") + return + } + } + res, err := p.wasmdKeeper.Execute(ctx, contractAddr, senderAddr, msg, coins) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(res) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func (p PrecompileExecutor) query(ctx sdk.Context, method *abi.Method, args []interface{}, value *big.Int) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + if err := pcommon.ValidateNonPayable(value); err != nil { + rerr = err + return + } + + if err := pcommon.ValidateArgsLength(args, 2); err != nil { + rerr = err + return + } + + contractAddrStr := args[0].(string) + // addresses will be sent in Sei format + contractAddr, err := sdk.AccAddressFromBech32(contractAddrStr) + if err != nil { + rerr = err + return + } + req := args[1].([]byte) + + rawContractMessage := wasmtypes.RawContractMessage(req) + if err := rawContractMessage.ValidateBasic(); err != nil { + rerr = err + return + } + res, err := p.wasmdViewKeeper.QuerySmartSafe(ctx, contractAddr, req) + if err != nil { + rerr = err + return + } + ret, rerr = method.Outputs.Pack(res) + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + return +} + +func IsWasmdCall(to *common.Address) bool { + return to != nil && (to.Cmp(Address) == 0) +} diff --git a/precompiles/wasmd/setup.go b/precompiles/wasmd/setup.go index 76c4847a5f..48aa3f33ad 100644 --- a/precompiles/wasmd/setup.go +++ b/precompiles/wasmd/setup.go @@ -2,7 +2,6 @@ package wasmd import ( "github.com/ethereum/go-ethereum/core/vm" - "github.com/sei-protocol/sei-chain/precompiles/utils" wasmdv552 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v552" wasmdv555 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v555" @@ -15,6 +14,8 @@ import ( wasmdv605 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v605" wasmdv606 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v606" wasmdv610 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v610" + wasmdv614 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v614" + wasmdv620 "github.com/sei-protocol/sei-chain/precompiles/wasmd/legacy/v620" ) func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPrecompiles { @@ -31,6 +32,8 @@ func GetVersioned(latestUpgrade string, keepers utils.Keepers) utils.VersionedPr "v6.0.5": check(wasmdv605.NewPrecompile(keepers)), "v6.0.6": check(wasmdv606.NewPrecompile(keepers)), "v6.1.0": check(wasmdv610.NewPrecompile(keepers)), + "v6.1.4": check(wasmdv614.NewPrecompile(keepers)), + "v6.2.0": check(wasmdv620.NewPrecompile(keepers)), } } diff --git a/precompiles/wasmd/versions b/precompiles/wasmd/versions index 2806731d11..fbc185fcb0 100644 --- a/precompiles/wasmd/versions +++ b/precompiles/wasmd/versions @@ -10,3 +10,5 @@ v6.0.5 v6.0.6 v6.1.0 v6.1.4 +v6.2.0 +v6.3.0 diff --git a/proto/evm/params.proto b/proto/evm/params.proto index b437ea7845..8b5edb3d99 100644 --- a/proto/evm/params.proto +++ b/proto/evm/params.proto @@ -281,3 +281,71 @@ message ParamsPreV606 { (gogoproto.jsontag) = "maximum_fee_per_gas" ]; } + +message ParamsPreV630 { + option (gogoproto.goproto_stringer) = false; + + // string base_denom = 1 [ + // (gogoproto.moretags) = "yaml:\"base_denom\"", + // (gogoproto.jsontag) = "base_denom" + // ]; + string priority_normalizer = 2 [ + (gogoproto.moretags) = "yaml:\"priority_normalizer\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "priority_normalizer" + ]; + string base_fee_per_gas = 3 [ + (gogoproto.moretags) = "yaml:\"base_fee_per_gas\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "base_fee_per_gas" + ]; + string minimum_fee_per_gas = 4 [ + (gogoproto.moretags) = "yaml:\"minimum_fee_per_gas\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "minimum_fee_per_gas" + ]; + // ChainConfig chain_config = 5 [(gogoproto.moretags) = "yaml:\"chain_config\"", (gogoproto.nullable) = false]; + // string chain_id = 6 [ + // (gogoproto.moretags) = "yaml:\"chain_id\"", + // (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + // (gogoproto.nullable) = false, + // (gogoproto.jsontag) = "chain_id" + // ]; + // repeated string whitelisted_codehashes_bank_send = 7 [ + // (gogoproto.moretags) = "yaml:\"whitelisted_codehashes_bank_send\"", + // (gogoproto.jsontag) = "whitelisted_codehashes_bank_send" + // ]; + repeated bytes whitelisted_cw_code_hashes_for_delegate_call = 8 [ + (gogoproto.moretags) = "yaml:\"whitelisted_cw_code_hashes_for_delegate_call\"", + (gogoproto.jsontag) = "whitelisted_cw_code_hashes_for_delegate_call" + ]; + + uint64 deliver_tx_hook_wasm_gas_limit = 9; + + string max_dynamic_base_fee_upward_adjustment = 10 [ + (gogoproto.moretags) = "yaml:\"max_dynamic_base_fee_upward_adjustment\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "max_dynamic_base_fee_upward_adjustment" + ]; + string max_dynamic_base_fee_downward_adjustment = 11 [ + (gogoproto.moretags) = "yaml:\"max_dynamic_base_fee_downward_adjustment\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "max_dynamic_base_fee_downward_adjustment" + ]; + uint64 target_gas_used_per_block = 12; + string maximum_fee_per_gas = 13 [ + (gogoproto.moretags) = "yaml:\"maximum_fee_per_gas\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "maximum_fee_per_gas" + ]; + bool register_pointer_disabled = 14 [ + (gogoproto.moretags) = "yaml:\"register_pointer_disabled\"", + (gogoproto.jsontag) = "register_pointer_disabled" + ]; +} diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh index b4089a98c2..c65fa67d33 100755 --- a/scripts/bump-version.sh +++ b/scripts/bump-version.sh @@ -63,6 +63,7 @@ if [ "$any_change" = true ]; then cp "$SRC" "$TARGET/" # Replace package line sed -i '' "1s|^package .*|package $TAG_FOLDER|" "$TARGET/precompiles.go" + sed -i '' "1s|^package .*|package $TAG_FOLDER|" "$TARGET/evm_events.go" fi fi @@ -110,4 +111,4 @@ find "$ROOT_DIR" -mindepth 1 -maxdepth 1 -type d | while read -r dir; do done # --- Append new tag --- -echo "$NEW_TAG" >> "$TAG_FILE" \ No newline at end of file +echo "$NEW_TAG" >> "$TAG_FILE" diff --git a/sei-cosmos/go.mod b/sei-cosmos/go.mod index e2f4a2dc37..478f4ee4a5 100644 --- a/sei-cosmos/go.mod +++ b/sei-cosmos/go.mod @@ -177,7 +177,7 @@ replace ( github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.23.2 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.2.0 - github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.15.7-sei-7.0.20250929182230-93350978bb7c + github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.15.7-sei-14 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 diff --git a/sei-cosmos/types/module/simulation.go b/sei-cosmos/types/module/simulation.go new file mode 100644 index 0000000000..7edc90cde3 --- /dev/null +++ b/sei-cosmos/types/module/simulation.go @@ -0,0 +1,145 @@ +package module + +import ( + "encoding/json" + + "math/rand" + "sort" + "time" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/simulation" +) + +// AppModuleSimulation defines the standard functions that every module should expose +// for the SDK blockchain simulator +type AppModuleSimulation interface { + // randomized genesis states + GenerateGenesisState(input *SimulationState) + + // content functions used to simulate governance proposals + ProposalContents(simState SimulationState) []simulation.WeightedProposalContent + + // randomized module parameters for param change proposals + RandomizedParams(r *rand.Rand) []simulation.ParamChange + + // register a func to decode the each module's defined types from their corresponding store key + RegisterStoreDecoder(sdk.StoreDecoderRegistry) + + // simulation operations (i.e msgs) with their respective weight + WeightedOperations(simState SimulationState) []simulation.WeightedOperation +} + +// SimulationManager defines a simulation manager that provides the high level utility +// for managing and executing simulation functionalities for a group of modules +type SimulationManager struct { + Modules []AppModuleSimulation // array of app modules; we use an array for deterministic simulation tests + StoreDecoders sdk.StoreDecoderRegistry // functions to decode the key-value pairs from each module's store +} + +// NewSimulationManager creates a new SimulationManager object +// +// CONTRACT: All the modules provided must be also registered on the module Manager +func NewSimulationManager(modules ...AppModuleSimulation) *SimulationManager { + return &SimulationManager{ + Modules: modules, + StoreDecoders: make(sdk.StoreDecoderRegistry), + } +} + +// NewSimulationManagerFromAppModules creates a new SimulationManager object. +// +// First it sets any SimulationModule provided by overrideModules, and ignores any AppModule +// with the same moduleName. +// Then it attempts to cast every provided AppModule into an AppModuleSimulation. +// If the cast succeeds, its included, otherwise it is excluded. +func NewSimulationManagerFromAppModules(modules map[string]AppModule, overrideModules map[string]AppModuleSimulation) *SimulationManager { + simModules := []AppModuleSimulation{} + appModuleNamesSorted := make([]string, 0, len(modules)) + for moduleName := range modules { + appModuleNamesSorted = append(appModuleNamesSorted, moduleName) + } + + sort.Strings(appModuleNamesSorted) + + for _, moduleName := range appModuleNamesSorted { + // for every module, see if we override it. If so, use override. + // Else, if we can cast the app module into a simulation module add it. + // otherwise no simulation module. + if simModule, ok := overrideModules[moduleName]; ok { + simModules = append(simModules, simModule) + } else { + appModule := modules[moduleName] + if simModule, ok := appModule.(AppModuleSimulation); ok { + simModules = append(simModules, simModule) + } + // cannot cast, so we continue + } + } + return NewSimulationManager(simModules...) +} + +// GetProposalContents returns each module's proposal content generator function +// with their default operation weight and key. +func (sm *SimulationManager) GetProposalContents(simState SimulationState) []simulation.WeightedProposalContent { + wContents := make([]simulation.WeightedProposalContent, 0, len(sm.Modules)) + for _, module := range sm.Modules { + wContents = append(wContents, module.ProposalContents(simState)...) + } + + return wContents +} + +// RegisterStoreDecoders registers each of the modules' store decoders into a map +func (sm *SimulationManager) RegisterStoreDecoders() { + for _, module := range sm.Modules { + module.RegisterStoreDecoder(sm.StoreDecoders) + } +} + +// GenerateGenesisStates generates a randomized GenesisState for each of the +// registered modules +func (sm *SimulationManager) GenerateGenesisStates(simState *SimulationState) { + for _, module := range sm.Modules { + module.GenerateGenesisState(simState) + } +} + +// GenerateParamChanges generates randomized contents for creating params change +// proposal transactions +func (sm *SimulationManager) GenerateParamChanges(seed int64) (paramChanges []simulation.ParamChange) { + r := rand.New(rand.NewSource(seed)) + + for _, module := range sm.Modules { + paramChanges = append(paramChanges, module.RandomizedParams(r)...) + } + + return +} + +// WeightedOperations returns all the modules' weighted operations of an application +func (sm *SimulationManager) WeightedOperations(simState SimulationState) []simulation.WeightedOperation { + wOps := make([]simulation.WeightedOperation, 0, len(sm.Modules)) + for _, module := range sm.Modules { + wOps = append(wOps, module.WeightedOperations(simState)...) + } + + return wOps +} + +// SimulationState is the input parameters used on each of the module's randomized +// GenesisState generator function +type SimulationState struct { + AppParams simulation.AppParams + Cdc codec.JSONCodec // application codec + Rand *rand.Rand // random number + GenState map[string]json.RawMessage // genesis state + Accounts []simulation.Account // simulation accounts + InitialStake int64 // initial coins per account + NumBonded int64 // number of initially bonded accounts + GenTimestamp time.Time // genesis timestamp + UnbondTime time.Duration // staking unbond time stored to use it as the slashing maximum evidence duration + ParamChanges []simulation.ParamChange // simulated parameter changes from modules + Contents []simulation.WeightedProposalContent // proposal content generator functions with their default weight and app sim key +} diff --git a/sei-cosmos/x/auth/module.go b/sei-cosmos/x/auth/module.go index 9831aaaace..35289a2e0a 100644 --- a/sei-cosmos/x/auth/module.go +++ b/sei-cosmos/x/auth/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -16,15 +17,18 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/client/rest" "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/cosmos/cosmos-sdk/x/auth/simulation" "github.com/cosmos/cosmos-sdk/x/auth/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the auth module. @@ -97,14 +101,16 @@ func (AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) type AppModule struct { AppModuleBasic - accountKeeper keeper.AccountKeeper + accountKeeper keeper.AccountKeeper + randGenAccountsFn types.RandomGenesisAccountsFn } // NewAppModule creates a new AppModule object -func NewAppModule(cdc codec.Codec, accountKeeper keeper.AccountKeeper) AppModule { +func NewAppModule(cdc codec.Codec, accountKeeper keeper.AccountKeeper, randGenAccountsFn types.RandomGenesisAccountsFn) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{}, - accountKeeper: accountKeeper, + AppModuleBasic: AppModuleBasic{}, + accountKeeper: accountKeeper, + randGenAccountsFn: randGenAccountsFn, } } @@ -171,3 +177,30 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 3 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the auth module +func (am AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState, am.randGenAccountsFn) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized auth param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for auth module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.accountKeeper) +} + +// WeightedOperations doesn't return any auth module operation. +func (AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/sei-cosmos/x/auth/simulation/decoder.go b/sei-cosmos/x/auth/simulation/decoder.go new file mode 100644 index 0000000000..61a551ba52 --- /dev/null +++ b/sei-cosmos/x/auth/simulation/decoder.go @@ -0,0 +1,48 @@ +package simulation + +import ( + "bytes" + "fmt" + + gogotypes "github.com/gogo/protobuf/types" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +type AuthUnmarshaler interface { + UnmarshalAccount([]byte) (types.AccountI, error) + GetCodec() codec.BinaryCodec +} + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding auth type. +func NewDecodeStore(ak AuthUnmarshaler) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.AddressStoreKeyPrefix): + accA, err := ak.UnmarshalAccount(kvA.Value) + if err != nil { + panic(err) + } + + accB, err := ak.UnmarshalAccount(kvB.Value) + if err != nil { + panic(err) + } + + return fmt.Sprintf("%v\n%v", accA, accB) + + case bytes.Equal(kvA.Key, types.GlobalAccountNumberKey): + var globalAccNumberA, globalAccNumberB gogotypes.UInt64Value + ak.GetCodec().MustUnmarshal(kvA.Value, &globalAccNumberA) + ak.GetCodec().MustUnmarshal(kvB.Value, &globalAccNumberB) + + return fmt.Sprintf("GlobalAccNumberA: %d\nGlobalAccNumberB: %d", globalAccNumberA, globalAccNumberB) + + default: + panic(fmt.Sprintf("unexpected %s key %X (%s)", types.ModuleName, kvA.Key, kvA.Key)) + } + } +} diff --git a/sei-cosmos/x/auth/simulation/genesis.go b/sei-cosmos/x/auth/simulation/genesis.go new file mode 100644 index 0000000000..5a0c884848 --- /dev/null +++ b/sei-cosmos/x/auth/simulation/genesis.go @@ -0,0 +1,134 @@ +package simulation + +import ( + "encoding/json" + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/auth/types" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" +) + +// Simulation parameter constants +const ( + MaxMemoChars = "max_memo_characters" + TxSigLimit = "tx_sig_limit" + TxSizeCostPerByte = "tx_size_cost_per_byte" + SigVerifyCostED25519 = "sig_verify_cost_ed25519" + SigVerifyCostSECP256K1 = "sig_verify_cost_secp256k1" +) + +// RandomGenesisAccounts defines the default RandomGenesisAccountsFn used on the SDK. +// It creates a slice of BaseAccount, ContinuousVestingAccount and DelayedVestingAccount. +func RandomGenesisAccounts(simState *module.SimulationState) types.GenesisAccounts { + genesisAccs := make(types.GenesisAccounts, len(simState.Accounts)) + for i, acc := range simState.Accounts { + bacc := types.NewBaseAccountWithAddress(acc.Address) + + // Only consider making a vesting account once the initial bonded validator + // set is exhausted due to needing to track DelegatedVesting. + if !(int64(i) > simState.NumBonded && simState.Rand.Intn(100) < 50) { + genesisAccs[i] = bacc + continue + } + + initialVesting := sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, simState.Rand.Int63n(simState.InitialStake))) + var endTime int64 + + startTime := simState.GenTimestamp.Unix() + + // Allow for some vesting accounts to vest very quickly while others very slowly. + if simState.Rand.Intn(100) < 50 { + endTime = int64(simulation.RandIntBetween(simState.Rand, int(startTime)+1, int(startTime+(60*60*24*30)))) + } else { + endTime = int64(simulation.RandIntBetween(simState.Rand, int(startTime)+1, int(startTime+(60*60*12)))) + } + + bva := vestingtypes.NewBaseVestingAccount(bacc, initialVesting, endTime, nil) + + if simState.Rand.Intn(100) < 50 { + genesisAccs[i] = vestingtypes.NewContinuousVestingAccountRaw(bva, startTime) + } else { + genesisAccs[i] = vestingtypes.NewDelayedVestingAccountRaw(bva) + } + } + + return genesisAccs +} + +// GenMaxMemoChars randomized MaxMemoChars +func GenMaxMemoChars(r *rand.Rand) uint64 { + return uint64(simulation.RandIntBetween(r, 100, 200)) +} + +// GenTxSigLimit randomized TxSigLimit +// make sure that sigLimit is always high +// so that arbitrarily simulated messages from other +// modules can still create valid transactions +func GenTxSigLimit(r *rand.Rand) uint64 { + return uint64(r.Intn(7) + 5) +} + +// GenTxSizeCostPerByte randomized TxSizeCostPerByte +func GenTxSizeCostPerByte(r *rand.Rand) uint64 { + return uint64(simulation.RandIntBetween(r, 5, 15)) +} + +// GenSigVerifyCostED25519 randomized SigVerifyCostED25519 +func GenSigVerifyCostED25519(r *rand.Rand) uint64 { + return uint64(simulation.RandIntBetween(r, 500, 1000)) +} + +// GenSigVerifyCostSECP256K1 randomized SigVerifyCostSECP256K1 +func GenSigVerifyCostSECP256K1(r *rand.Rand) uint64 { + return uint64(simulation.RandIntBetween(r, 500, 1000)) +} + +// RandomizedGenState generates a random GenesisState for auth +func RandomizedGenState(simState *module.SimulationState, randGenAccountsFn types.RandomGenesisAccountsFn) { + var maxMemoChars uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, MaxMemoChars, &maxMemoChars, simState.Rand, + func(r *rand.Rand) { maxMemoChars = GenMaxMemoChars(r) }, + ) + + var txSigLimit uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, TxSigLimit, &txSigLimit, simState.Rand, + func(r *rand.Rand) { txSigLimit = GenTxSigLimit(r) }, + ) + + var txSizeCostPerByte uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, TxSizeCostPerByte, &txSizeCostPerByte, simState.Rand, + func(r *rand.Rand) { txSizeCostPerByte = GenTxSizeCostPerByte(r) }, + ) + + var sigVerifyCostED25519 uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, SigVerifyCostED25519, &sigVerifyCostED25519, simState.Rand, + func(r *rand.Rand) { sigVerifyCostED25519 = GenSigVerifyCostED25519(r) }, + ) + + var sigVerifyCostSECP256K1 uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, SigVerifyCostSECP256K1, &sigVerifyCostSECP256K1, simState.Rand, + func(r *rand.Rand) { sigVerifyCostSECP256K1 = GenSigVerifyCostSECP256K1(r) }, + ) + + params := types.NewParams(maxMemoChars, txSigLimit, txSizeCostPerByte, + sigVerifyCostED25519, sigVerifyCostSECP256K1) + genesisAccs := randGenAccountsFn(simState) + + authGenesis := types.NewGenesisState(params, genesisAccs) + + bz, err := json.MarshalIndent(&authGenesis.Params, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated auth parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(authGenesis) +} diff --git a/sei-cosmos/x/auth/simulation/params.go b/sei-cosmos/x/auth/simulation/params.go new file mode 100644 index 0000000000..5ce9ac95fc --- /dev/null +++ b/sei-cosmos/x/auth/simulation/params.go @@ -0,0 +1,40 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/simulation" +) + +const ( + keyMaxMemoCharacters = "MaxMemoCharacters" + keyTxSigLimit = "TxSigLimit" + keyTxSizeCostPerByte = "TxSizeCostPerByte" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, keyMaxMemoCharacters, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenMaxMemoChars(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyTxSigLimit, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenTxSigLimit(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyTxSizeCostPerByte, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenTxSizeCostPerByte(r)) + }, + ), + } +} diff --git a/sei-cosmos/x/auth/types/genesis.go b/sei-cosmos/x/auth/types/genesis.go index 9e3bfa51c5..380d85fc6b 100644 --- a/sei-cosmos/x/auth/types/genesis.go +++ b/sei-cosmos/x/auth/types/genesis.go @@ -9,10 +9,14 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/types/module" ) var _ types.UnpackInterfacesMessage = GenesisState{} +// RandomGenesisAccountsFn defines the function required to generate custom account types +type RandomGenesisAccountsFn func(simState *module.SimulationState) GenesisAccounts + // NewGenesisState - Create a new genesis state func NewGenesisState(params Params, accounts GenesisAccounts) *GenesisState { genAccounts, err := PackAccounts(accounts) diff --git a/sei-cosmos/x/authz/module/module.go b/sei-cosmos/x/authz/module/module.go index fa83845472..7ef812abc4 100644 --- a/sei-cosmos/x/authz/module/module.go +++ b/sei-cosmos/x/authz/module/module.go @@ -3,6 +3,7 @@ package authz import ( "context" "encoding/json" + "math/rand" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -15,14 +16,17 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/authz" "github.com/cosmos/cosmos-sdk/x/authz/client/cli" "github.com/cosmos/cosmos-sdk/x/authz/keeper" + "github.com/cosmos/cosmos-sdk/x/authz/simulation" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the authz module. @@ -167,3 +171,36 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 1 } + +// ____________________________________________________________________________ + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the authz module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the authz content functions used to +// simulate governance proposals. +func (am AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized authz param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for authz module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[keeper.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, + am.accountKeeper, am.bankKeeper, am.keeper, am.cdc, + ) +} diff --git a/sei-cosmos/x/authz/simulation/decoder.go b/sei-cosmos/x/authz/simulation/decoder.go new file mode 100644 index 0000000000..908a90abf5 --- /dev/null +++ b/sei-cosmos/x/authz/simulation/decoder.go @@ -0,0 +1,27 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/authz" + "github.com/cosmos/cosmos-sdk/x/authz/keeper" +) + +// NewDecodeStore returns a decoder function closure that umarshals the KVPair's +// Value to the corresponding authz type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], keeper.GrantKey): + var grantA, grantB authz.Grant + cdc.MustUnmarshal(kvA.Value, &grantA) + cdc.MustUnmarshal(kvB.Value, &grantB) + return fmt.Sprintf("%v\n%v", grantA, grantB) + default: + panic(fmt.Sprintf("invalid authz key %X", kvA.Key)) + } + } +} diff --git a/sei-cosmos/x/authz/simulation/genesis.go b/sei-cosmos/x/authz/simulation/genesis.go new file mode 100644 index 0000000000..2f80524544 --- /dev/null +++ b/sei-cosmos/x/authz/simulation/genesis.go @@ -0,0 +1,59 @@ +package simulation + +import ( + "math/rand" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/authz" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" +) + +// genGrant returns a slice of authorization grants. +func genGrant(r *rand.Rand, accounts []simtypes.Account) []authz.GrantAuthorization { + authorizations := make([]authz.GrantAuthorization, len(accounts)-1) + for i := 0; i < len(accounts)-1; i++ { + granter := accounts[i] + grantee := accounts[i+1] + authorizations[i] = authz.GrantAuthorization{ + Granter: granter.Address.String(), + Grantee: grantee.Address.String(), + Authorization: generateRandomGrant(r), + } + } + + return authorizations +} + +func generateRandomGrant(r *rand.Rand) *codectypes.Any { + authorizations := make([]*codectypes.Any, 2) + authorizations[0] = newAnyAuthorization(banktypes.NewSendAuthorization(sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000))))) + authorizations[1] = newAnyAuthorization(authz.NewGenericAuthorization(sdk.MsgTypeURL(&govtypes.MsgSubmitProposal{}))) + + return authorizations[r.Intn(len(authorizations))] +} + +func newAnyAuthorization(a authz.Authorization) *codectypes.Any { + any, err := codectypes.NewAnyWithValue(a) + if err != nil { + panic(err) + } + + return any +} + +// RandomizedGenState generates a random GenesisState for authz. +func RandomizedGenState(simState *module.SimulationState) { + var grants []authz.GrantAuthorization + simState.AppParams.GetOrGenerate( + simState.Cdc, "authz", &grants, simState.Rand, + func(r *rand.Rand) { grants = genGrant(r, simState.Accounts) }, + ) + + authzGrantsGenesis := authz.NewGenesisState(grants) + + simState.GenState[authz.ModuleName] = simState.Cdc.MustMarshalJSON(authzGrantsGenesis) +} diff --git a/sei-cosmos/x/authz/simulation/operations.go b/sei-cosmos/x/authz/simulation/operations.go new file mode 100644 index 0000000000..22be11da27 --- /dev/null +++ b/sei-cosmos/x/authz/simulation/operations.go @@ -0,0 +1,297 @@ +package simulation + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/authz" + seiappparams "github.com/sei-protocol/sei-chain/app/params" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/authz/keeper" + + banktype "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/simulation" +) + +// authz message types +var ( + TypeMsgGrant = sdk.MsgTypeURL(&authz.MsgGrant{}) + TypeMsgRevoke = sdk.MsgTypeURL(&authz.MsgRevoke{}) + TypeMsgExec = sdk.MsgTypeURL(&authz.MsgExec{}) +) + +// Simulation operation weights constants +const ( + OpWeightMsgGrant = "op_weight_msg_grant" + OpWeightRevoke = "op_weight_msg_revoke" + OpWeightExec = "op_weight_msg_execute" +) + +// authz operations weights +const ( + WeightGrant = 100 + WeightRevoke = 90 + WeightExec = 90 +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, ak authz.AccountKeeper, bk authz.BankKeeper, k keeper.Keeper, appCdc cdctypes.AnyUnpacker) simulation.WeightedOperations { + + var ( + weightMsgGrant int + weightRevoke int + weightExec int + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgGrant, &weightMsgGrant, nil, + func(_ *rand.Rand) { + weightMsgGrant = WeightGrant + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightRevoke, &weightRevoke, nil, + func(_ *rand.Rand) { + weightRevoke = WeightRevoke + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightExec, &weightExec, nil, + func(_ *rand.Rand) { + weightExec = WeightExec + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgGrant, + SimulateMsgGrant(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightRevoke, + SimulateMsgRevoke(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightExec, + SimulateMsgExec(ak, bk, k, appCdc), + ), + } +} + +// SimulateMsgGrant generates a MsgGrant with random values. +func SimulateMsgGrant(ak authz.AccountKeeper, bk authz.BankKeeper, _ keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + granter, _ := simtypes.RandomAcc(r, accs) + grantee, _ := simtypes.RandomAcc(r, accs) + + if granter.Address.Equals(grantee.Address) { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgGrant, "granter and grantee are same"), nil, nil + } + + granterAcc := ak.GetAccount(ctx, granter.Address) + spendableCoins := bk.SpendableCoins(ctx, granter.Address) + fees, err := simtypes.RandomFees(r, ctx, spendableCoins) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgGrant, err.Error()), nil, err + } + + spendLimit := spendableCoins.Sub(fees) + if spendLimit == nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgGrant, "spend limit is nil"), nil, nil + } + + expiration := ctx.BlockTime().AddDate(1, 0, 0) + msg, err := authz.NewMsgGrant(granter.Address, grantee.Address, generateRandomAuthorization(r, spendLimit), expiration) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgGrant, err.Error()), nil, err + } + txCfg := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txCfg, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{granterAcc.GetAccountNumber()}, + []uint64{granterAcc.GetSequence()}, + granter.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgGrant, "unable to generate mock tx"), nil, err + } + + _, _, err = app.Deliver(txCfg.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, sdk.MsgTypeURL(msg), "unable to deliver tx"), nil, err + } + return simtypes.NewOperationMsg(msg, true, "", nil), nil, err + } +} + +func generateRandomAuthorization(r *rand.Rand, spendLimit sdk.Coins) authz.Authorization { + authorizations := make([]authz.Authorization, 2) + authorizations[0] = banktype.NewSendAuthorization(spendLimit) + authorizations[1] = authz.NewGenericAuthorization(sdk.MsgTypeURL(&banktype.MsgSend{})) + + return authorizations[r.Intn(len(authorizations))] +} + +// SimulateMsgRevoke generates a MsgRevoke with random values. +func SimulateMsgRevoke(ak authz.AccountKeeper, bk authz.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + var granterAddr, granteeAddr sdk.AccAddress + var grant authz.Grant + hasGrant := false + + k.IterateGrants(ctx, func(granter, grantee sdk.AccAddress, g authz.Grant) bool { + grant = g + granterAddr = granter + granteeAddr = grantee + hasGrant = true + return true + }) + + if !hasGrant { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "no grants"), nil, nil + } + + granterAcc, ok := simtypes.FindAccount(accs, granterAddr) + if !ok { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "account not found"), nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "account not found") + } + + spendableCoins := bk.SpendableCoins(ctx, granterAddr) + fees, err := simtypes.RandomFees(r, ctx, spendableCoins) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "fee error"), nil, err + } + + a := grant.GetAuthorization() + msg := authz.NewMsgRevoke(granterAddr, granteeAddr, a.MsgTypeURL()) + txCfg := seiappparams.MakeEncodingConfig().TxConfig + account := ak.GetAccount(ctx, granterAddr) + tx, err := simulation.GenTx( + txCfg, + []sdk.Msg{&msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + granterAcc.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, err.Error()), nil, err + } + + _, _, err = app.Deliver(txCfg.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "unable to deliver tx"), nil, err + } + + return simtypes.NewOperationMsg(&msg, true, "", nil), nil, nil + } +} + +// SimulateMsgExec generates a MsgExec with random values. +func SimulateMsgExec(ak authz.AccountKeeper, bk authz.BankKeeper, k keeper.Keeper, cdc cdctypes.AnyUnpacker) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + hasGrant := false + var targetGrant authz.Grant + var granterAddr sdk.AccAddress + var granteeAddr sdk.AccAddress + k.IterateGrants(ctx, func(granter, grantee sdk.AccAddress, grant authz.Grant) bool { + targetGrant = grant + granterAddr = granter + granteeAddr = grantee + hasGrant = true + return true + }) + + if !hasGrant { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, "no grant found"), nil, nil + } + + if targetGrant.Expiration.Before(ctx.BlockHeader().Time) { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, "grant expired"), nil, nil + } + + grantee, ok := simtypes.FindAccount(accs, granteeAddr) + if !ok { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "Account not found"), nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "grantee account not found") + } + + if _, ok := simtypes.FindAccount(accs, granterAddr); !ok { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgRevoke, "Account not found"), nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "granter account not found") + } + + granterspendableCoins := bk.SpendableCoins(ctx, granterAddr) + coins := simtypes.RandSubsetCoins(r, granterspendableCoins) + // Check send_enabled status of each sent coin denom + if err := bk.IsSendEnabledCoins(ctx, coins...); err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, err.Error()), nil, nil + } + + msg := []sdk.Msg{banktype.NewMsgSend(granterAddr, granteeAddr, coins)} + authorization := targetGrant.GetAuthorization() + + sendAuth, ok := authorization.(*banktype.SendAuthorization) + if !ok { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, "not a send authorization"), nil, nil + } + + _, err := sendAuth.Accept(ctx, msg[0]) + if err != nil { + if sdkerrors.ErrInsufficientFunds.Is(err) { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, err.Error()), nil, nil + } else { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, err.Error()), nil, err + } + } + + msgExec := authz.NewMsgExec(granteeAddr, msg) + granteeSpendableCoins := bk.SpendableCoins(ctx, granteeAddr) + fees, err := simtypes.RandomFees(r, ctx, granteeSpendableCoins) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, "fee error"), nil, err + } + + txCfg := seiappparams.MakeEncodingConfig().TxConfig + granteeAcc := ak.GetAccount(ctx, granteeAddr) + tx, err := simulation.GenTx( + txCfg, + []sdk.Msg{&msgExec}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{granteeAcc.GetAccountNumber()}, + []uint64{granteeAcc.GetSequence()}, + grantee.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, err.Error()), nil, err + } + + _, _, err = app.Deliver(txCfg.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, err.Error()), nil, err + } + + err = msgExec.UnpackInterfaces(cdc) + if err != nil { + return simtypes.NoOpMsg(authz.ModuleName, TypeMsgExec, "unmarshal error"), nil, err + } + return simtypes.NewOperationMsg(&msgExec, true, "success", nil), nil, nil + } +} diff --git a/sei-cosmos/x/bank/module.go b/sei-cosmos/x/bank/module.go index f50dcb3b0e..494a629be7 100644 --- a/sei-cosmos/x/bank/module.go +++ b/sei-cosmos/x/bank/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "time" "github.com/gorilla/mux" @@ -17,15 +18,18 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/bank/client/cli" "github.com/cosmos/cosmos-sdk/x/bank/client/rest" "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/cosmos/cosmos-sdk/x/bank/simulation" "github.com/cosmos/cosmos-sdk/x/bank/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the bank module. @@ -173,3 +177,30 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 2 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the bank module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized bank param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for supply module's types +func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, am.accountKeeper, am.keeper, + ) +} diff --git a/sei-cosmos/x/bank/simulation/genesis.go b/sei-cosmos/x/bank/simulation/genesis.go new file mode 100644 index 0000000000..9031d03364 --- /dev/null +++ b/sei-cosmos/x/bank/simulation/genesis.go @@ -0,0 +1,86 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// RandomGenesisDefaultSendParam computes randomized allow all send transfers param for the bank module +func RandomGenesisDefaultSendParam(r *rand.Rand) bool { + // 90% chance of transfers being enable or P(a) = 0.9 for success + return r.Int63n(101) <= 90 +} + +// RandomGenesisSendParams randomized Parameters for the bank module +func RandomGenesisSendParams(r *rand.Rand) types.SendEnabledParams { + params := types.DefaultParams() + // 90% chance of transfers being DefaultSendEnabled=true or P(a) = 0.9 for success + // 50% of the time add an additional denom specific record (P(b) = 0.475 = 0.5 * 0.95) + if r.Int63n(101) <= 50 { + // set send enabled 95% of the time + bondEnabled := r.Int63n(101) <= 95 + params = params.SetSendEnabledParam( + sdk.DefaultBondDenom, + bondEnabled) + } + + // overall probability of enabled for bond denom is 94.75% (P(a)+P(b) - P(a)*P(b)) + return params.SendEnabled +} + +// RandomGenesisBalances returns a slice of account balances. Each account has +// a balance of simState.InitialStake for sdk.DefaultBondDenom. +func RandomGenesisBalances(simState *module.SimulationState) []types.Balance { + genesisBalances := []types.Balance{} + + for _, acc := range simState.Accounts { + genesisBalances = append(genesisBalances, types.Balance{ + Address: acc.Address.String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(simState.InitialStake))), + }) + } + + return genesisBalances +} + +// RandomizedGenState generates a random GenesisState for bank +func RandomizedGenState(simState *module.SimulationState) { + var sendEnabledParams types.SendEnabledParams + simState.AppParams.GetOrGenerate( + simState.Cdc, string(types.KeySendEnabled), &sendEnabledParams, simState.Rand, + func(r *rand.Rand) { sendEnabledParams = RandomGenesisSendParams(r) }, + ) + + var defaultSendEnabledParam bool + simState.AppParams.GetOrGenerate( + simState.Cdc, string(types.KeyDefaultSendEnabled), &defaultSendEnabledParam, simState.Rand, + func(r *rand.Rand) { defaultSendEnabledParam = RandomGenesisDefaultSendParam(r) }, + ) + + numAccs := int64(len(simState.Accounts)) + totalSupply := sdk.NewInt(simState.InitialStake * (numAccs + simState.NumBonded)) + supply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupply)) + + bankGenesis := types.GenesisState{ + Params: types.Params{ + SendEnabled: sendEnabledParams, + DefaultSendEnabled: defaultSendEnabledParam, + }, + Balances: RandomGenesisBalances(simState), + Supply: supply, + } + + paramsBytes, err := json.MarshalIndent(&bankGenesis.Params, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated bank parameters:\n%s\n", paramsBytes) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&bankGenesis) +} diff --git a/sei-cosmos/x/bank/simulation/operations.go b/sei-cosmos/x/bank/simulation/operations.go new file mode 100644 index 0000000000..6b11aaf9a8 --- /dev/null +++ b/sei-cosmos/x/bank/simulation/operations.go @@ -0,0 +1,424 @@ +package simulation + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/cosmos/cosmos-sdk/x/bank/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// Simulation operation weights constants +const ( + OpWeightMsgSend = "op_weight_msg_send" + OpWeightMsgMultiSend = "op_weight_msg_multisend" +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk keeper.Keeper, +) simulation.WeightedOperations { + + var weightMsgSend, weightMsgMultiSend int + appParams.GetOrGenerate(cdc, OpWeightMsgSend, &weightMsgSend, nil, + func(_ *rand.Rand) { + weightMsgSend = seiappparams.DefaultWeightMsgSend + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgMultiSend, &weightMsgMultiSend, nil, + func(_ *rand.Rand) { + weightMsgMultiSend = seiappparams.DefaultWeightMsgMultiSend + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgSend, + SimulateMsgSend(ak, bk), + ), + simulation.NewWeightedOperation( + weightMsgMultiSend, + SimulateMsgMultiSend(ak, bk), + ), + } +} + +// SimulateMsgSend tests and runs a single msg send where both +// accounts already exist. +func SimulateMsgSend(ak types.AccountKeeper, bk keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + from, to, coins, skip := randomSendFields(r, ctx, accs, bk, ak) + + // Check send_enabled status of each coin denom + if err := bk.IsSendEnabledCoins(ctx, coins...); err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSend, err.Error()), nil, nil + } + + if skip { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSend, "skip all transfers"), nil, nil + } + + msg := types.NewMsgSend(from.Address, to.Address, coins) + + err := sendMsgSend(r, app, bk, ak, msg, ctx, chainID, []cryptotypes.PrivKey{from.PrivKey}) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "invalid transfers"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} + +// SimulateMsgSendToModuleAccount tests and runs a single msg send where both +// accounts already exist. +func SimulateMsgSendToModuleAccount(ak types.AccountKeeper, bk keeper.Keeper, moduleAccCount int) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + from := accs[0] + + to := getModuleAccounts(ak, ctx, moduleAccCount)[0] + + spendable := bk.SpendableCoins(ctx, from.Address) + coins := simtypes.RandSubsetCoins(r, spendable) + + // Check send_enabled status of each coin denom + if err := bk.IsSendEnabledCoins(ctx, coins...); err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSend, err.Error()), nil, nil + } + + msg := types.NewMsgSend(from.Address, to.Address, coins) + + err := sendMsgSend(r, app, bk, ak, msg, ctx, chainID, []cryptotypes.PrivKey{from.PrivKey}) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "invalid transfers"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} + +// sendMsgSend sends a transaction with a MsgSend from a provided random account. +func sendMsgSend( + r *rand.Rand, app *baseapp.BaseApp, bk keeper.Keeper, ak types.AccountKeeper, + msg *types.MsgSend, ctx sdk.Context, chainID string, privkeys []cryptotypes.PrivKey, +) error { + + var ( + fees sdk.Coins + err error + ) + + from, err := sdk.AccAddressFromBech32(msg.FromAddress) + if err != nil { + return err + } + + account := ak.GetAccount(ctx, from) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + coins, hasNeg := spendable.SafeSub(msg.Amount) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return err + } + } + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + privkeys..., + ) + if err != nil { + return err + } + + _, _, err = app.Deliver(txGen.TxEncoder(), tx) + if err != nil { + return err + } + + return nil +} + +// SimulateMsgMultiSend tests and runs a single msg multisend, with randomized, capped number of inputs/outputs. +// all accounts in msg fields exist in state +func SimulateMsgMultiSend(ak types.AccountKeeper, bk keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + + // random number of inputs/outputs between [1, 3] + inputs := make([]types.Input, r.Intn(3)+1) + outputs := make([]types.Output, r.Intn(3)+1) + + // collect signer privKeys + privs := make([]cryptotypes.PrivKey, len(inputs)) + + // use map to check if address already exists as input + usedAddrs := make(map[string]bool) + + var totalSentCoins sdk.Coins + for i := range inputs { + // generate random input fields, ignore to address + from, _, coins, skip := randomSendFields(r, ctx, accs, bk, ak) + + // make sure account is fresh and not used in previous input + for usedAddrs[from.Address.String()] { + from, _, coins, skip = randomSendFields(r, ctx, accs, bk, ak) + } + + if skip { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgMultiSend, "skip all transfers"), nil, nil + } + + // set input address in used address map + usedAddrs[from.Address.String()] = true + + // set signer privkey + privs[i] = from.PrivKey + + // set next input and accumulate total sent coins + inputs[i] = types.NewInput(from.Address, coins) + totalSentCoins = totalSentCoins.Add(coins...) + } + + // Check send_enabled status of each sent coin denom + if err := bk.IsSendEnabledCoins(ctx, totalSentCoins...); err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgMultiSend, err.Error()), nil, nil + } + + for o := range outputs { + outAddr, _ := simtypes.RandomAcc(r, accs) + + var outCoins sdk.Coins + // split total sent coins into random subsets for output + if o == len(outputs)-1 { + outCoins = totalSentCoins + } else { + // take random subset of remaining coins for output + // and update remaining coins + outCoins = simtypes.RandSubsetCoins(r, totalSentCoins) + totalSentCoins = totalSentCoins.Sub(outCoins) + } + + outputs[o] = types.NewOutput(outAddr.Address, outCoins) + } + + // remove any output that has no coins + + for i := 0; i < len(outputs); { + if outputs[i].Coins.Empty() { + outputs[i] = outputs[len(outputs)-1] + outputs = outputs[:len(outputs)-1] + } else { + // continue onto next coin + i++ + } + } + + msg := &types.MsgMultiSend{ + Inputs: inputs, + Outputs: outputs, + } + err := sendMsgMultiSend(r, app, bk, ak, msg, ctx, chainID, privs) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "invalid transfers"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} + +// SimulateMsgMultiSendToModuleAccount sends coins to Module Accounts +func SimulateMsgMultiSendToModuleAccount(ak types.AccountKeeper, bk keeper.Keeper, moduleAccCount int) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + + inputs := make([]types.Input, 2) + outputs := make([]types.Output, moduleAccCount) + // collect signer privKeys + privs := make([]cryptotypes.PrivKey, len(inputs)) + + var totalSentCoins sdk.Coins + for i := range inputs { + sender := accs[i] + privs[i] = sender.PrivKey + spendable := bk.SpendableCoins(ctx, sender.Address) + coins := simtypes.RandSubsetCoins(r, spendable) + inputs[i] = types.NewInput(sender.Address, coins) + totalSentCoins = totalSentCoins.Add(coins...) + } + + if err := bk.IsSendEnabledCoins(ctx, totalSentCoins...); err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgMultiSend, err.Error()), nil, nil + } + + moduleAccounts := getModuleAccounts(ak, ctx, moduleAccCount) + for i := range outputs { + var outCoins sdk.Coins + // split total sent coins into random subsets for output + if i == len(outputs)-1 { + outCoins = totalSentCoins + } else { + // take random subset of remaining coins for output + // and update remaining coins + outCoins = simtypes.RandSubsetCoins(r, totalSentCoins) + totalSentCoins = totalSentCoins.Sub(outCoins) + } + + outputs[i] = types.NewOutput(moduleAccounts[i].Address, outCoins) + } + + // remove any output that has no coins + + for i := 0; i < len(outputs); { + if outputs[i].Coins.Empty() { + outputs[i] = outputs[len(outputs)-1] + outputs = outputs[:len(outputs)-1] + } else { + // continue onto next coin + i++ + } + } + + msg := &types.MsgMultiSend{ + Inputs: inputs, + Outputs: outputs, + } + err := sendMsgMultiSend(r, app, bk, ak, msg, ctx, chainID, privs) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "invalid transfers"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} + +// sendMsgMultiSend sends a transaction with a MsgMultiSend from a provided random +// account. +func sendMsgMultiSend( + r *rand.Rand, app *baseapp.BaseApp, bk keeper.Keeper, ak types.AccountKeeper, + msg *types.MsgMultiSend, ctx sdk.Context, chainID string, privkeys []cryptotypes.PrivKey, +) error { + + accountNumbers := make([]uint64, len(msg.Inputs)) + sequenceNumbers := make([]uint64, len(msg.Inputs)) + + for i := 0; i < len(msg.Inputs); i++ { + addr := sdk.MustAccAddressFromBech32(msg.Inputs[i].Address) + acc := ak.GetAccount(ctx, addr) + accountNumbers[i] = acc.GetAccountNumber() + sequenceNumbers[i] = acc.GetSequence() + } + + var ( + fees sdk.Coins + err error + ) + + addr := sdk.MustAccAddressFromBech32(msg.Inputs[0].Address) + + // feePayer is the first signer, i.e. first input address + feePayer := ak.GetAccount(ctx, addr) + spendable := bk.SpendableCoins(ctx, feePayer.GetAddress()) + + coins, hasNeg := spendable.SafeSub(msg.Inputs[0].Coins) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return err + } + } + + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + accountNumbers, + sequenceNumbers, + privkeys..., + ) + if err != nil { + return err + } + + _, _, err = app.Deliver(txGen.TxEncoder(), tx) + if err != nil { + return err + } + + return nil +} + +// randomSendFields returns the sender and recipient simulation accounts as well +// as the transferred amount. +func randomSendFields( + r *rand.Rand, ctx sdk.Context, accs []simtypes.Account, bk keeper.Keeper, ak types.AccountKeeper, +) (simtypes.Account, simtypes.Account, sdk.Coins, bool) { + + from, _ := simtypes.RandomAcc(r, accs) + to, _ := simtypes.RandomAcc(r, accs) + + // disallow sending money to yourself + for from.PubKey.Equals(to.PubKey) { + to, _ = simtypes.RandomAcc(r, accs) + } + + acc := ak.GetAccount(ctx, from.Address) + if acc == nil { + return from, to, nil, true + } + + spendable := bk.SpendableCoins(ctx, acc.GetAddress()) + + sendCoins := simtypes.RandSubsetCoins(r, spendable) + if sendCoins.Empty() { + return from, to, nil, true + } + + return from, to, sendCoins, false +} + +func getModuleAccounts(ak types.AccountKeeper, ctx sdk.Context, moduleAccCount int) []simtypes.Account { + + moduleAccounts := make([]simtypes.Account, moduleAccCount) + + for i := 0; i < moduleAccCount; i++ { + addr := ak.GetModuleAddress(distributiontypes.ModuleName) + acc := ak.GetAccount(ctx, addr) + mAcc := simtypes.Account{ + Address: acc.GetAddress(), + PrivKey: nil, + ConsKey: nil, + PubKey: acc.GetPubKey(), + } + moduleAccounts[i] = mAcc + } + + return moduleAccounts +} diff --git a/sei-cosmos/x/bank/simulation/params.go b/sei-cosmos/x/bank/simulation/params.go new file mode 100644 index 0000000000..222f88acab --- /dev/null +++ b/sei-cosmos/x/bank/simulation/params.go @@ -0,0 +1,35 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/x/simulation" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.KeySendEnabled), + func(r *rand.Rand) string { + paramsBytes, err := json.Marshal(RandomGenesisSendParams(r)) + if err != nil { + panic(err) + } + return string(paramsBytes) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyDefaultSendEnabled), + func(r *rand.Rand) string { + return fmt.Sprintf("%v", RandomGenesisDefaultSendParam(r)) + }, + ), + } +} diff --git a/sei-cosmos/x/capability/module.go b/sei-cosmos/x/capability/module.go index 4273f0dda1..9bdf54a610 100644 --- a/sei-cosmos/x/capability/module.go +++ b/sei-cosmos/x/capability/module.go @@ -3,6 +3,7 @@ package capability import ( "encoding/json" "fmt" + "math/rand" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -15,13 +16,16 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/capability/keeper" + "github.com/cosmos/cosmos-sdk/x/capability/simulation" "github.com/cosmos/cosmos-sdk/x/capability/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // ---------------------------------------------------------------------------- @@ -153,3 +157,28 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 1 } + +// GenerateGenesisState creates a randomized GenState of the capability module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents performs a no-op +func (am AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized capability param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for capability module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/sei-cosmos/x/capability/simulation/decoder.go b/sei-cosmos/x/capability/simulation/decoder.go new file mode 100644 index 0000000000..96e2c41c0a --- /dev/null +++ b/sei-cosmos/x/capability/simulation/decoder.go @@ -0,0 +1,33 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/capability/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding capability type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key, types.KeyIndex): + idxA := sdk.BigEndianToUint64(kvA.Value) + idxB := sdk.BigEndianToUint64(kvB.Value) + return fmt.Sprintf("Index A: %d\nIndex B: %d\n", idxA, idxB) + + case bytes.HasPrefix(kvA.Key, types.KeyPrefixIndexCapability): + var capOwnersA, capOwnersB types.CapabilityOwners + cdc.MustUnmarshal(kvA.Value, &capOwnersA) + cdc.MustUnmarshal(kvB.Value, &capOwnersB) + return fmt.Sprintf("CapabilityOwners A: %v\nCapabilityOwners B: %v\n", capOwnersA, capOwnersB) + + default: + panic(fmt.Sprintf("invalid %s key prefix %X (%s)", types.ModuleName, kvA.Key, string(kvA.Key))) + } + } +} diff --git a/sei-cosmos/x/capability/simulation/genesis.go b/sei-cosmos/x/capability/simulation/genesis.go new file mode 100644 index 0000000000..ab1d11fb3d --- /dev/null +++ b/sei-cosmos/x/capability/simulation/genesis.go @@ -0,0 +1,39 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/capability/types" +) + +// Simulation parameter constants +const index = "index" + +// GenIndex returns a random global index between 1-1000 +func GenIndex(r *rand.Rand) uint64 { + return uint64(r.Int63n(1000)) + 1 +} + +// RandomizedGenState generates a random GenesisState for capability +func RandomizedGenState(simState *module.SimulationState) { + var idx uint64 + + simState.AppParams.GetOrGenerate( + simState.Cdc, index, &idx, simState.Rand, + func(r *rand.Rand) { idx = GenIndex(r) }, + ) + + capabilityGenesis := types.GenesisState{Index: idx} + + bz, err := json.MarshalIndent(&capabilityGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&capabilityGenesis) +} diff --git a/sei-cosmos/x/distribution/module.go b/sei-cosmos/x/distribution/module.go index bf2944d46c..9fd030fdaa 100644 --- a/sei-cosmos/x/distribution/module.go +++ b/sei-cosmos/x/distribution/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -16,15 +17,18 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" "github.com/cosmos/cosmos-sdk/x/distribution/client/rest" "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + "github.com/cosmos/cosmos-sdk/x/distribution/simulation" "github.com/cosmos/cosmos-sdk/x/distribution/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the distribution module. @@ -178,3 +182,33 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 2 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the distribution module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the distribution content functions used to +// simulate governance proposals. +func (am AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return simulation.ProposalContents(am.keeper) +} + +// RandomizedParams creates randomized distribution param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for distribution module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.keeper, am.stakingKeeper, + ) +} diff --git a/sei-cosmos/x/distribution/simulation/decoder.go b/sei-cosmos/x/distribution/simulation/decoder.go new file mode 100644 index 0000000000..a1d64d20dc --- /dev/null +++ b/sei-cosmos/x/distribution/simulation/decoder.go @@ -0,0 +1,70 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding distribution type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.FeePoolKey): + var feePoolA, feePoolB types.FeePool + cdc.MustUnmarshal(kvA.Value, &feePoolA) + cdc.MustUnmarshal(kvB.Value, &feePoolB) + return fmt.Sprintf("%v\n%v", feePoolA, feePoolB) + + case bytes.Equal(kvA.Key[:1], types.ProposerKey): + return fmt.Sprintf("%v\n%v", sdk.ConsAddress(kvA.Value), sdk.ConsAddress(kvB.Value)) + + case bytes.Equal(kvA.Key[:1], types.ValidatorOutstandingRewardsPrefix): + var rewardsA, rewardsB types.ValidatorOutstandingRewards + cdc.MustUnmarshal(kvA.Value, &rewardsA) + cdc.MustUnmarshal(kvB.Value, &rewardsB) + return fmt.Sprintf("%v\n%v", rewardsA, rewardsB) + + case bytes.Equal(kvA.Key[:1], types.DelegatorWithdrawAddrPrefix): + return fmt.Sprintf("%v\n%v", sdk.AccAddress(kvA.Value), sdk.AccAddress(kvB.Value)) + + case bytes.Equal(kvA.Key[:1], types.DelegatorStartingInfoPrefix): + var infoA, infoB types.DelegatorStartingInfo + cdc.MustUnmarshal(kvA.Value, &infoA) + cdc.MustUnmarshal(kvB.Value, &infoB) + return fmt.Sprintf("%v\n%v", infoA, infoB) + + case bytes.Equal(kvA.Key[:1], types.ValidatorHistoricalRewardsPrefix): + var rewardsA, rewardsB types.ValidatorHistoricalRewards + cdc.MustUnmarshal(kvA.Value, &rewardsA) + cdc.MustUnmarshal(kvB.Value, &rewardsB) + return fmt.Sprintf("%v\n%v", rewardsA, rewardsB) + + case bytes.Equal(kvA.Key[:1], types.ValidatorCurrentRewardsPrefix): + var rewardsA, rewardsB types.ValidatorCurrentRewards + cdc.MustUnmarshal(kvA.Value, &rewardsA) + cdc.MustUnmarshal(kvB.Value, &rewardsB) + return fmt.Sprintf("%v\n%v", rewardsA, rewardsB) + + case bytes.Equal(kvA.Key[:1], types.ValidatorAccumulatedCommissionPrefix): + var commissionA, commissionB types.ValidatorAccumulatedCommission + cdc.MustUnmarshal(kvA.Value, &commissionA) + cdc.MustUnmarshal(kvB.Value, &commissionB) + return fmt.Sprintf("%v\n%v", commissionA, commissionB) + + case bytes.Equal(kvA.Key[:1], types.ValidatorSlashEventPrefix): + var eventA, eventB types.ValidatorSlashEvent + cdc.MustUnmarshal(kvA.Value, &eventA) + cdc.MustUnmarshal(kvB.Value, &eventB) + return fmt.Sprintf("%v\n%v", eventA, eventB) + + default: + panic(fmt.Sprintf("invalid distribution key prefix %X", kvA.Key[:1])) + } + } +} diff --git a/sei-cosmos/x/distribution/simulation/genesis.go b/sei-cosmos/x/distribution/simulation/genesis.go new file mode 100644 index 0000000000..3f64d5c01e --- /dev/null +++ b/sei-cosmos/x/distribution/simulation/genesis.go @@ -0,0 +1,85 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +// Simulation parameter constants +const ( + CommunityTax = "community_tax" + BaseProposerReward = "base_proposer_reward" + BonusProposerReward = "bonus_proposer_reward" + WithdrawEnabled = "withdraw_enabled" +) + +// GenCommunityTax randomized CommunityTax +func GenCommunityTax(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)) +} + +// GenBaseProposerReward randomized BaseProposerReward +func GenBaseProposerReward(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)) +} + +// GenBonusProposerReward randomized BonusProposerReward +func GenBonusProposerReward(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)) +} + +// GenWithdrawEnabled returns a randomized WithdrawEnabled parameter. +func GenWithdrawEnabled(r *rand.Rand) bool { + return r.Int63n(101) <= 95 // 95% chance of withdraws being enabled +} + +// RandomizedGenState generates a random GenesisState for distribution +func RandomizedGenState(simState *module.SimulationState) { + var communityTax sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, CommunityTax, &communityTax, simState.Rand, + func(r *rand.Rand) { communityTax = GenCommunityTax(r) }, + ) + + var baseProposerReward sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, BaseProposerReward, &baseProposerReward, simState.Rand, + func(r *rand.Rand) { baseProposerReward = GenBaseProposerReward(r) }, + ) + + var bonusProposerReward sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, BonusProposerReward, &bonusProposerReward, simState.Rand, + func(r *rand.Rand) { bonusProposerReward = GenBonusProposerReward(r) }, + ) + + var withdrawEnabled bool + simState.AppParams.GetOrGenerate( + simState.Cdc, WithdrawEnabled, &withdrawEnabled, simState.Rand, + func(r *rand.Rand) { withdrawEnabled = GenWithdrawEnabled(r) }, + ) + + distrGenesis := types.GenesisState{ + FeePool: types.InitialFeePool(), + Params: types.Params{ + CommunityTax: communityTax, + BaseProposerReward: baseProposerReward, + BonusProposerReward: bonusProposerReward, + WithdrawAddrEnabled: withdrawEnabled, + }, + } + + bz, err := json.MarshalIndent(&distrGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated distribution parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&distrGenesis) +} diff --git a/sei-cosmos/x/distribution/simulation/operations.go b/sei-cosmos/x/distribution/simulation/operations.go new file mode 100644 index 0000000000..9e1630439a --- /dev/null +++ b/sei-cosmos/x/distribution/simulation/operations.go @@ -0,0 +1,247 @@ +package simulation + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/simulation" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// Simulation operation weights constants +const ( + OpWeightMsgSetWithdrawAddress = "op_weight_msg_set_withdraw_address" + OpWeightMsgWithdrawDelegationReward = "op_weight_msg_withdraw_delegation_reward" + OpWeightMsgWithdrawValidatorCommission = "op_weight_msg_withdraw_validator_commission" + OpWeightMsgFundCommunityPool = "op_weight_msg_fund_community_pool" +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations(appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk types.StakingKeeper) simulation.WeightedOperations { + var weightMsgSetWithdrawAddress int + appParams.GetOrGenerate(cdc, OpWeightMsgSetWithdrawAddress, &weightMsgSetWithdrawAddress, nil, + func(_ *rand.Rand) { + weightMsgSetWithdrawAddress = seiappparams.DefaultWeightMsgSetWithdrawAddress + }, + ) + + var weightMsgWithdrawDelegationReward int + appParams.GetOrGenerate(cdc, OpWeightMsgWithdrawDelegationReward, &weightMsgWithdrawDelegationReward, nil, + func(_ *rand.Rand) { + weightMsgWithdrawDelegationReward = seiappparams.DefaultWeightMsgWithdrawDelegationReward + }, + ) + + var weightMsgWithdrawValidatorCommission int + appParams.GetOrGenerate(cdc, OpWeightMsgWithdrawValidatorCommission, &weightMsgWithdrawValidatorCommission, nil, + func(_ *rand.Rand) { + weightMsgWithdrawValidatorCommission = seiappparams.DefaultWeightMsgWithdrawValidatorCommission + }, + ) + + var weightMsgFundCommunityPool int + appParams.GetOrGenerate(cdc, OpWeightMsgFundCommunityPool, &weightMsgFundCommunityPool, nil, + func(_ *rand.Rand) { + weightMsgFundCommunityPool = seiappparams.DefaultWeightMsgFundCommunityPool + }, + ) + + stakeKeeper := sk.(stakingkeeper.Keeper) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgSetWithdrawAddress, + SimulateMsgSetWithdrawAddress(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgWithdrawDelegationReward, + SimulateMsgWithdrawDelegatorReward(ak, bk, k, stakeKeeper), + ), + simulation.NewWeightedOperation( + weightMsgWithdrawValidatorCommission, + SimulateMsgWithdrawValidatorCommission(ak, bk, k, stakeKeeper), + ), + simulation.NewWeightedOperation( + weightMsgFundCommunityPool, + SimulateMsgFundCommunityPool(ak, bk, k, stakeKeeper), + ), + } +} + +// SimulateMsgSetWithdrawAddress generates a MsgSetWithdrawAddress with random values. +func SimulateMsgSetWithdrawAddress(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if !k.GetWithdrawAddrEnabled(ctx) { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSetWithdrawAddress, "withdrawal is not enabled"), nil, nil + } + + simAccount, _ := simtypes.RandomAcc(r, accs) + simToAccount, _ := simtypes.RandomAcc(r, accs) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + msg := types.NewMsgSetWithdrawAddress(simAccount.Address, simToAccount.Address) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgWithdrawDelegatorReward generates a MsgWithdrawDelegatorReward with random values. +func SimulateMsgWithdrawDelegatorReward(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + delegations := sk.GetAllDelegatorDelegations(ctx, simAccount.Address) + if len(delegations) == 0 { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawDelegatorReward, "number of delegators equal 0"), nil, nil + } + + delegation := delegations[r.Intn(len(delegations))] + + validator := sk.Validator(ctx, delegation.GetValidatorAddr()) + if validator == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawDelegatorReward, "validator is nil"), nil, fmt.Errorf("validator %s not found", delegation.GetValidatorAddr()) + } + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + msg := types.NewMsgWithdrawDelegatorReward(simAccount.Address, validator.GetOperator()) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgWithdrawValidatorCommission generates a MsgWithdrawValidatorCommission with random values. +func SimulateMsgWithdrawValidatorCommission(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + + validator, ok := stakingkeeper.RandomValidator(r, sk, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawValidatorCommission, "random validator is not ok"), nil, nil + } + + commission := k.GetValidatorAccumulatedCommission(ctx, validator.GetOperator()) + if commission.Commission.IsZero() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawValidatorCommission, "validator commission is zero"), nil, nil + } + + simAccount, found := simtypes.FindAccount(accs, sdk.AccAddress(validator.GetOperator())) + if !found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawValidatorCommission, "could not find account"), nil, fmt.Errorf("validator %s not found", validator.GetOperator()) + } + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + msg := types.NewMsgWithdrawValidatorCommission(validator.GetOperator()) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgFundCommunityPool simulates MsgFundCommunityPool execution where +// a random account sends a random amount of its funds to the community pool. +func SimulateMsgFundCommunityPool(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + + funder, _ := simtypes.RandomAcc(r, accs) + + account := ak.GetAccount(ctx, funder.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + fundAmount := simtypes.RandSubsetCoins(r, spendable) + if fundAmount.Empty() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgFundCommunityPool, "fund amount is empty"), nil, nil + } + + var ( + fees sdk.Coins + err error + ) + + coins, hasNeg := spendable.SafeSub(fundAmount) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgFundCommunityPool, "unable to generate fees"), nil, err + } + } + + msg := types.NewMsgFundCommunityPool(fundAmount, funder.Address) + + txCtx := simulation.OperationInput{ + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: funder, + AccountKeeper: ak, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTx(txCtx, fees) + } +} diff --git a/sei-cosmos/x/distribution/simulation/params.go b/sei-cosmos/x/distribution/simulation/params.go new file mode 100644 index 0000000000..98fcec342f --- /dev/null +++ b/sei-cosmos/x/distribution/simulation/params.go @@ -0,0 +1,41 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/x/simulation" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +const ( + keyCommunityTax = "communitytax" + keyBaseProposerReward = "baseproposerreward" + keyBonusProposerReward = "bonusproposerreward" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, keyCommunityTax, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenCommunityTax(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyBaseProposerReward, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenBaseProposerReward(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyBonusProposerReward, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenBonusProposerReward(r)) + }, + ), + } +} diff --git a/sei-cosmos/x/distribution/simulation/proposals.go b/sei-cosmos/x/distribution/simulation/proposals.go new file mode 100644 index 0000000000..dd019b29ac --- /dev/null +++ b/sei-cosmos/x/distribution/simulation/proposals.go @@ -0,0 +1,51 @@ +package simulation + +import ( + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// OpWeightSubmitCommunitySpendProposal app params key for community spend proposal +const OpWeightSubmitCommunitySpendProposal = "op_weight_submit_community_spend_proposal" + +// ProposalContents defines the module weighted proposals' contents +func ProposalContents(k keeper.Keeper) []simtypes.WeightedProposalContent { + return []simtypes.WeightedProposalContent{ + simulation.NewWeightedProposalContent( + OpWeightSubmitCommunitySpendProposal, + seiappparams.DefaultWeightCommunitySpendProposal, + SimulateCommunityPoolSpendProposalContent(k), + ), + } +} + +// SimulateCommunityPoolSpendProposalContent generates random community-pool-spend proposal content +func SimulateCommunityPoolSpendProposalContent(k keeper.Keeper) simtypes.ContentSimulatorFn { + return func(r *rand.Rand, ctx sdk.Context, accs []simtypes.Account) simtypes.Content { + simAccount, _ := simtypes.RandomAcc(r, accs) + + balance := k.GetFeePool(ctx).CommunityPool + if balance.Empty() { + return nil + } + + denomIndex := r.Intn(len(balance)) + amount, err := simtypes.RandPositiveInt(r, balance[denomIndex].Amount.TruncateInt()) + if err != nil { + return nil + } + + return types.NewCommunityPoolSpendProposal( + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 100), + simAccount.Address, + sdk.NewCoins(sdk.NewCoin(balance[denomIndex].Denom, amount)), + ) + } +} diff --git a/sei-cosmos/x/evidence/module.go b/sei-cosmos/x/evidence/module.go index 5052ce8267..d531b044b4 100644 --- a/sei-cosmos/x/evidence/module.go +++ b/sei-cosmos/x/evidence/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -17,16 +18,19 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" eviclient "github.com/cosmos/cosmos-sdk/x/evidence/client" "github.com/cosmos/cosmos-sdk/x/evidence/client/cli" "github.com/cosmos/cosmos-sdk/x/evidence/client/rest" "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + "github.com/cosmos/cosmos-sdk/x/evidence/simulation" "github.com/cosmos/cosmos-sdk/x/evidence/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // ---------------------------------------------------------------------------- @@ -192,3 +196,31 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 1 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the evidence module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the evidence content functions used to +// simulate governance proposals. +func (am AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized evidence param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for evidence module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.keeper) +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/sei-cosmos/x/evidence/simulation/decoder.go b/sei-cosmos/x/evidence/simulation/decoder.go new file mode 100644 index 0000000000..d8c185fd04 --- /dev/null +++ b/sei-cosmos/x/evidence/simulation/decoder.go @@ -0,0 +1,37 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/evidence/exported" + "github.com/cosmos/cosmos-sdk/x/evidence/types" +) + +type EvidenceUnmarshaler interface { + UnmarshalEvidence([]byte) (exported.Evidence, error) +} + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding evidence type. +func NewDecodeStore(cdc EvidenceUnmarshaler) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.KeyPrefixEvidence): + evidenceA, err := cdc.UnmarshalEvidence(kvA.Value) + if err != nil { + panic(fmt.Sprintf("cannot unmarshal evidence: %s", err.Error())) + } + + evidenceB, err := cdc.UnmarshalEvidence(kvB.Value) + if err != nil { + panic(fmt.Sprintf("cannot unmarshal evidence: %s", err.Error())) + } + + return fmt.Sprintf("%v\n%v", evidenceA, evidenceB) + default: + panic(fmt.Sprintf("invalid %s key prefix %X", types.ModuleName, kvA.Key[:1])) + } + } +} diff --git a/sei-cosmos/x/evidence/simulation/genesis.go b/sei-cosmos/x/evidence/simulation/genesis.go new file mode 100644 index 0000000000..640670ebe9 --- /dev/null +++ b/sei-cosmos/x/evidence/simulation/genesis.go @@ -0,0 +1,41 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/evidence/exported" + "github.com/cosmos/cosmos-sdk/x/evidence/types" +) + +// Simulation parameter constants +const evidence = "evidence" + +// GenEvidences returns an empty slice of evidences. +func GenEvidences(_ *rand.Rand, _ []simtypes.Account) []exported.Evidence { + return []exported.Evidence{} +} + +// RandomizedGenState generates a random GenesisState for evidence +func RandomizedGenState(simState *module.SimulationState) { + var ev []exported.Evidence + + simState.AppParams.GetOrGenerate( + simState.Cdc, evidence, &ev, simState.Rand, + func(r *rand.Rand) { ev = GenEvidences(r, simState.Accounts) }, + ) + + evidenceGenesis := types.NewGenesisState(ev) + + bz, err := json.MarshalIndent(&evidenceGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(evidenceGenesis) +} diff --git a/sei-cosmos/x/feegrant/module/module.go b/sei-cosmos/x/feegrant/module/module.go index 21a748578b..7db1f924c0 100644 --- a/sei-cosmos/x/feegrant/module/module.go +++ b/sei-cosmos/x/feegrant/module/module.go @@ -3,6 +3,7 @@ package module import ( "context" "encoding/json" + "math/rand" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -17,14 +18,17 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/feegrant" "github.com/cosmos/cosmos-sdk/x/feegrant/client/cli" "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + "github.com/cosmos/cosmos-sdk/x/feegrant/simulation" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // ---------------------------------------------------------------------------- @@ -188,3 +192,33 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 1 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the feegrant module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the feegrant content functions used to +// simulate governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized feegrant param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for feegrant module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[feegrant.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns all the feegrant module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.keeper, + ) +} diff --git a/sei-cosmos/x/feegrant/simulation/decoder.go b/sei-cosmos/x/feegrant/simulation/decoder.go new file mode 100644 index 0000000000..bc0cc1fed6 --- /dev/null +++ b/sei-cosmos/x/feegrant/simulation/decoder.go @@ -0,0 +1,26 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/feegrant" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding feegrant type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], feegrant.FeeAllowanceKeyPrefix): + var grantA, grantB feegrant.Grant + cdc.MustUnmarshal(kvA.Value, &grantA) + cdc.MustUnmarshal(kvB.Value, &grantB) + return fmt.Sprintf("%v\n%v", grantA, grantB) + default: + panic(fmt.Sprintf("invalid feegrant key %X", kvA.Key)) + } + } +} diff --git a/sei-cosmos/x/feegrant/simulation/genesis.go b/sei-cosmos/x/feegrant/simulation/genesis.go new file mode 100644 index 0000000000..8c030bcd58 --- /dev/null +++ b/sei-cosmos/x/feegrant/simulation/genesis.go @@ -0,0 +1,77 @@ +package simulation + +import ( + "math/rand" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/feegrant" +) + +// genFeeGrants returns a slice of randomly generated allowances. +func genFeeGrants(r *rand.Rand, accounts []simtypes.Account) []feegrant.Grant { + allowances := make([]feegrant.Grant, len(accounts)-1) + for i := 0; i < len(accounts)-1; i++ { + granter := accounts[i].Address + grantee := accounts[i+1].Address + allowances[i] = generateRandomAllowances(granter, grantee, r) + } + return allowances +} + +func generateRandomAllowances(granter, grantee sdk.AccAddress, r *rand.Rand) feegrant.Grant { + allowances := make([]feegrant.Grant, 3) + spendLimit := sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(100))) + periodSpendLimit := sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10))) + + basic := feegrant.BasicAllowance{ + SpendLimit: spendLimit, + } + + basicAllowance, err := feegrant.NewGrant(granter, grantee, &basic) + if err != nil { + panic(err) + } + allowances[0] = basicAllowance + + periodicAllowance, err := feegrant.NewGrant(granter, grantee, &feegrant.PeriodicAllowance{ + Basic: basic, + PeriodSpendLimit: periodSpendLimit, + Period: time.Hour, + }) + if err != nil { + panic(err) + } + allowances[1] = periodicAllowance + + filteredAllowance, err := feegrant.NewGrant(granter, grantee, &feegrant.AllowedMsgAllowance{ + Allowance: basicAllowance.GetAllowance(), + AllowedMessages: []string{"/cosmos.gov.v1beta1.MsgSubmitProposal"}, + }) + if err != nil { + panic(err) + } + allowances[2] = filteredAllowance + + return allowances[r.Intn(len(allowances))] +} + +// RandomizedGenState generates a random GenesisState for feegrant +func RandomizedGenState(simState *module.SimulationState) { + var feegrants []feegrant.Grant + + simState.AppParams.GetOrGenerate( + simState.Cdc, "feegrant", &feegrants, simState.Rand, + func(r *rand.Rand) { feegrants = genFeeGrants(r, simState.Accounts) }, + ) + + feegrantGenesis := feegrant.NewGenesisState(feegrants) + bz, err := simState.Cdc.MarshalJSON(feegrantGenesis) + if err != nil { + panic(err) + } + + simState.GenState[feegrant.ModuleName] = bz +} diff --git a/sei-cosmos/x/feegrant/simulation/operations.go b/sei-cosmos/x/feegrant/simulation/operations.go new file mode 100644 index 0000000000..8766e21087 --- /dev/null +++ b/sei-cosmos/x/feegrant/simulation/operations.go @@ -0,0 +1,158 @@ +package simulation + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/feegrant" + "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// Simulation operation weights constants +const ( + OpWeightMsgGrantAllowance = "op_weight_msg_grant_fee_allowance" + OpWeightMsgRevokeAllowance = "op_weight_msg_grant_revoke_allowance" +) + +var ( + TypeMsgGrantAllowance = sdk.MsgTypeURL(&feegrant.MsgGrantAllowance{}) + TypeMsgRevokeAllowance = sdk.MsgTypeURL(&feegrant.MsgRevokeAllowance{}) +) + +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, + ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper, +) simulation.WeightedOperations { + var ( + weightMsgGrantAllowance int + weightMsgRevokeAllowance int + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgGrantAllowance, &weightMsgGrantAllowance, nil, + func(_ *rand.Rand) { + weightMsgGrantAllowance = seiappparams.DefaultWeightGrantAllowance + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgRevokeAllowance, &weightMsgRevokeAllowance, nil, + func(_ *rand.Rand) { + weightMsgRevokeAllowance = seiappparams.DefaultWeightRevokeAllowance + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgGrantAllowance, + SimulateMsgGrantAllowance(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgRevokeAllowance, + SimulateMsgRevokeAllowance(ak, bk, k), + ), + } +} + +// SimulateMsgGrantAllowance generates MsgGrantAllowance with random values. +func SimulateMsgGrantAllowance(ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + granter, _ := simtypes.RandomAcc(r, accs) + grantee, _ := simtypes.RandomAcc(r, accs) + if grantee.Address.String() == granter.Address.String() { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "grantee and granter cannot be same"), nil, nil + } + + if f, _ := k.GetAllowance(ctx, granter.Address, grantee.Address); f != nil { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "fee allowance exists"), nil, nil + } + + account := ak.GetAccount(ctx, granter.Address) + + spendableCoins := bk.SpendableCoins(ctx, account.GetAddress()) + if spendableCoins.Empty() { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "unable to grant empty coins as SpendLimit"), nil, nil + } + + oneYear := ctx.BlockTime().AddDate(1, 0, 0) + msg, err := feegrant.NewMsgGrantAllowance(&feegrant.BasicAllowance{ + SpendLimit: spendableCoins, + Expiration: &oneYear, + }, granter.Address, grantee.Address) + if err != nil { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, err.Error()), nil, err + } + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: TypeMsgGrantAllowance, + Context: ctx, + SimAccount: granter, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: feegrant.ModuleName, + CoinsSpentInMsg: spendableCoins, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgRevokeAllowance generates a MsgRevokeAllowance with random values. +func SimulateMsgRevokeAllowance(ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + hasGrant := false + var granterAddr sdk.AccAddress + var granteeAddr sdk.AccAddress + k.IterateAllFeeAllowances(ctx, func(grant feegrant.Grant) bool { + granter := sdk.MustAccAddressFromBech32(grant.Granter) + grantee := sdk.MustAccAddressFromBech32(grant.Grantee) + granterAddr = granter + granteeAddr = grantee + hasGrant = true + return true + }) + + if !hasGrant { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgRevokeAllowance, "no grants"), nil, nil + } + granter, ok := simtypes.FindAccount(accs, granterAddr) + + if !ok { + return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgRevokeAllowance, "Account not found"), nil, nil + } + + account := ak.GetAccount(ctx, granter.Address) + spendableCoins := bk.SpendableCoins(ctx, account.GetAddress()) + + msg := feegrant.NewMsgRevokeAllowance(granterAddr, granteeAddr) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: &msg, + MsgType: TypeMsgRevokeAllowance, + Context: ctx, + SimAccount: granter, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: feegrant.ModuleName, + CoinsSpentInMsg: spendableCoins, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} diff --git a/sei-cosmos/x/gov/module.go b/sei-cosmos/x/gov/module.go index b201eff7fb..ce53091a65 100644 --- a/sei-cosmos/x/gov/module.go +++ b/sei-cosmos/x/gov/module.go @@ -6,6 +6,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -17,16 +18,19 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" "github.com/cosmos/cosmos-sdk/x/gov/client/cli" "github.com/cosmos/cosmos-sdk/x/gov/client/rest" "github.com/cosmos/cosmos-sdk/x/gov/keeper" + "github.com/cosmos/cosmos-sdk/x/gov/simulation" "github.com/cosmos/cosmos-sdk/x/gov/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the gov module. @@ -200,3 +204,34 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 3 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the gov module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the gov content functions used to +// simulate governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return simulation.ProposalContents() +} + +// RandomizedParams creates randomized gov param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for gov module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, + am.accountKeeper, am.bankKeeper, am.keeper, simState.Contents, + ) +} diff --git a/sei-cosmos/x/gov/simulation/decoder.go b/sei-cosmos/x/gov/simulation/decoder.go new file mode 100644 index 0000000000..762b8ffb13 --- /dev/null +++ b/sei-cosmos/x/gov/simulation/decoder.go @@ -0,0 +1,54 @@ +package simulation + +import ( + "bytes" + "encoding/binary" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/gov/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding gov type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.ProposalsKeyPrefix): + var proposalA types.Proposal + err := cdc.Unmarshal(kvA.Value, &proposalA) + if err != nil { + panic(err) + } + var proposalB types.Proposal + err = cdc.Unmarshal(kvB.Value, &proposalB) + if err != nil { + panic(err) + } + return fmt.Sprintf("%v\n%v", proposalA, proposalB) + + case bytes.Equal(kvA.Key[:1], types.ActiveProposalQueuePrefix), + bytes.Equal(kvA.Key[:1], types.InactiveProposalQueuePrefix), + bytes.Equal(kvA.Key[:1], types.ProposalIDKey): + proposalIDA := binary.LittleEndian.Uint64(kvA.Value) + proposalIDB := binary.LittleEndian.Uint64(kvB.Value) + return fmt.Sprintf("proposalIDA: %d\nProposalIDB: %d", proposalIDA, proposalIDB) + + case bytes.Equal(kvA.Key[:1], types.DepositsKeyPrefix): + var depositA, depositB types.Deposit + cdc.MustUnmarshal(kvA.Value, &depositA) + cdc.MustUnmarshal(kvB.Value, &depositB) + return fmt.Sprintf("%v\n%v", depositA, depositB) + + case bytes.Equal(kvA.Key[:1], types.VotesKeyPrefix): + var voteA, voteB types.Vote + cdc.MustUnmarshal(kvA.Value, &voteA) + cdc.MustUnmarshal(kvB.Value, &voteB) + return fmt.Sprintf("%v\n%v", voteA, voteB) + + default: + panic(fmt.Sprintf("invalid governance key prefix %X", kvA.Key[:1])) + } + } +} diff --git a/sei-cosmos/x/gov/simulation/genesis.go b/sei-cosmos/x/gov/simulation/genesis.go new file mode 100644 index 0000000000..885d4443ca --- /dev/null +++ b/sei-cosmos/x/gov/simulation/genesis.go @@ -0,0 +1,158 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/gov/types" +) + +// Simulation parameter constants +const ( + DepositParamsMinDeposit = "deposit_params_min_deposit" + DepositParamsMinExpeditedDeposit = "deposit_params_min_expedited_deposit" + DepositParamsDepositPeriod = "deposit_params_deposit_period" + VotingParamsVotingPeriod = "voting_params_voting_period" + ExpeditedVotingParamsVotingPeriod = "expedited_voting_params_voting_period" + TallyParamsQuorum = "tally_params_quorum" + TallyParamsExpeditedQuorum = "tally_params_expedited_quorum" + TallyParamsThreshold = "tally_params_threshold" + TallyParamsExpeditedThreshold = "tally_params_expedited_threshold" + TallyParamsVeto = "tally_params_veto" +) + +// GenDepositParamsDepositPeriod randomized DepositParamsDepositPeriod +func GenDepositParamsDepositPeriod(r *rand.Rand) time.Duration { + return time.Duration(simulation.RandIntBetween(r, 1, 60*60*24*2)) * time.Second +} + +// GenDepositParamsMinDeposit randomized DepositParamsMinDeposit +func GenDepositParamsMinDeposit(r *rand.Rand) sdk.Coins { + return sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, int64(simulation.RandIntBetween(r, 1, 1e3/2)))) +} + +// GenDepositParamsMinExpeditedDeposit randomized DepositParamsMinExpeditedDeposit +func GenDepositParamsMinExpeditedDeposit(r *rand.Rand) sdk.Coins { + return sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, int64(simulation.RandIntBetween(r, 1e3/2, 1e3)))) +} + +// GenVotingParamsVotingPeriod randomized VotingParamsVotingPeriod +func GenVotingParamsVotingPeriod(r *rand.Rand) time.Duration { + return time.Duration(simulation.RandIntBetween(r, 60*60*24, 60*60*24*2)) * time.Second +} + +// GenVotingParamsExpeditedVotingPeriod randomized VotingParamsExpeditedVotingPeriod +func GenVotingParamsExpeditedVotingPeriod(r *rand.Rand) time.Duration { + return time.Duration(simulation.RandIntBetween(r, 1, 60*60*24)) * time.Second +} + +// GenTallyParamsQuorum randomized TallyParamsQuorum +func GenTallyParamsQuorum(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(simulation.RandIntBetween(r, 334, 500)), 3) +} + +// GenTallyExpeditedParamsQuorum randomized TallyParamsExpeditedQuorum +func GenTallyExpeditedParamsQuorum(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(simulation.RandIntBetween(r, 500, 550)), 3) +} + +// GenTallyParamsThreshold randomized TallyParamsThreshold +func GenTallyParamsThreshold(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(simulation.RandIntBetween(r, 450, 500)), 3) +} + +// GenTallyParamsExpeditedThreshold randomized TallyParamsExpeditedThreshold +func GenTallyParamsExpeditedThreshold(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(simulation.RandIntBetween(r, 500, 550)), 3) +} + +// GenTallyParamsVeto randomized TallyParamsVeto +func GenTallyParamsVeto(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(simulation.RandIntBetween(r, 250, 334)), 3) +} + +// RandomizedGenState generates a random GenesisState for gov +func RandomizedGenState(simState *module.SimulationState) { + startingProposalID := uint64(simState.Rand.Intn(100)) + + var minDeposit sdk.Coins + simState.AppParams.GetOrGenerate( + simState.Cdc, DepositParamsMinDeposit, &minDeposit, simState.Rand, + func(r *rand.Rand) { minDeposit = GenDepositParamsMinDeposit(r) }, + ) + + var minExpeditedDeposit sdk.Coins + simState.AppParams.GetOrGenerate( + simState.Cdc, DepositParamsMinExpeditedDeposit, &minExpeditedDeposit, simState.Rand, + func(r *rand.Rand) { minExpeditedDeposit = GenDepositParamsMinExpeditedDeposit(r) }, + ) + + var depositPeriod time.Duration + simState.AppParams.GetOrGenerate( + simState.Cdc, DepositParamsDepositPeriod, &depositPeriod, simState.Rand, + func(r *rand.Rand) { depositPeriod = GenDepositParamsDepositPeriod(r) }, + ) + + var votingPeriod time.Duration + simState.AppParams.GetOrGenerate( + simState.Cdc, VotingParamsVotingPeriod, &votingPeriod, simState.Rand, + func(r *rand.Rand) { votingPeriod = GenVotingParamsVotingPeriod(r) }, + ) + + var expeditedVotingPeriod time.Duration + simState.AppParams.GetOrGenerate( + simState.Cdc, ExpeditedVotingParamsVotingPeriod, &expeditedVotingPeriod, simState.Rand, + func(r *rand.Rand) { expeditedVotingPeriod = GenVotingParamsExpeditedVotingPeriod(r) }, + ) + + var quorum sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, TallyParamsQuorum, &quorum, simState.Rand, + func(r *rand.Rand) { quorum = GenTallyParamsQuorum(r) }, + ) + + var expeditedQuorum sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, TallyParamsExpeditedQuorum, &expeditedQuorum, simState.Rand, + func(r *rand.Rand) { expeditedQuorum = GenTallyExpeditedParamsQuorum(r) }, + ) + + var threshold sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, TallyParamsThreshold, &threshold, simState.Rand, + func(r *rand.Rand) { threshold = GenTallyParamsThreshold(r) }, + ) + + var expeditedThreshold sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, TallyParamsExpeditedThreshold, &expeditedThreshold, simState.Rand, + func(r *rand.Rand) { expeditedThreshold = GenTallyParamsExpeditedThreshold(r) }, + ) + + var veto sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, TallyParamsVeto, &veto, simState.Rand, + func(r *rand.Rand) { veto = GenTallyParamsVeto(r) }, + ) + + govGenesis := types.NewGenesisState( + startingProposalID, + types.NewDepositParams(minDeposit, minExpeditedDeposit, depositPeriod), + types.NewVotingParams(votingPeriod, expeditedVotingPeriod), + types.NewTallyParams(quorum, expeditedQuorum, threshold, expeditedThreshold, veto), + ) + + bz, err := json.MarshalIndent(&govGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated governance parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(govGenesis) +} diff --git a/sei-cosmos/x/gov/simulation/operations.go b/sei-cosmos/x/gov/simulation/operations.go new file mode 100644 index 0000000000..21d488a368 --- /dev/null +++ b/sei-cosmos/x/gov/simulation/operations.go @@ -0,0 +1,476 @@ +package simulation + +import ( + "math" + "math/rand" + "time" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/gov/keeper" + "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +var initialProposalID = uint64(100000000000000) + +// Simulation operation weights constants +const ( + OpWeightMsgDeposit = "op_weight_msg_deposit" + OpWeightMsgVote = "op_weight_msg_vote" + OpWeightMsgVoteWeighted = "op_weight_msg_weighted_vote" +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, + bk types.BankKeeper, k keeper.Keeper, wContents []simtypes.WeightedProposalContent, +) simulation.WeightedOperations { + + var ( + weightMsgDeposit int + weightMsgVote int + weightMsgVoteWeighted int + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgDeposit, &weightMsgDeposit, nil, + func(_ *rand.Rand) { + weightMsgDeposit = seiappparams.DefaultWeightMsgDeposit + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgVote, &weightMsgVote, nil, + func(_ *rand.Rand) { + weightMsgVote = seiappparams.DefaultWeightMsgVote + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgVoteWeighted, &weightMsgVoteWeighted, nil, + func(_ *rand.Rand) { + weightMsgVoteWeighted = seiappparams.DefaultWeightMsgVoteWeighted + }, + ) + + // generate the weighted operations for the proposal contents + var wProposalOps simulation.WeightedOperations + + for _, wContent := range wContents { + wContent := wContent // pin variable + var weight int + appParams.GetOrGenerate(cdc, wContent.AppParamsKey(), &weight, nil, + func(_ *rand.Rand) { weight = wContent.DefaultWeight() }) + + wProposalOps = append( + wProposalOps, + simulation.NewWeightedOperation( + weight, + SimulateMsgSubmitProposal(ak, bk, k, wContent.ContentSimulatorFn()), + ), + ) + } + + wGovOps := simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgDeposit, + SimulateMsgDeposit(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgVote, + SimulateMsgVote(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgVoteWeighted, + SimulateMsgVoteWeighted(ak, bk, k), + ), + } + + return append(wProposalOps, wGovOps...) +} + +// SimulateMsgSubmitProposal simulates creating a msg Submit Proposal +// voting on the proposal, and subsequently slashing the proposal. It is implemented using +// future operations. +func SimulateMsgSubmitProposal( + ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, contentSim simtypes.ContentSimulatorFn, +) simtypes.Operation { + // The states are: + // column 1: All validators vote + // column 2: 90% vote + // column 3: 75% vote + // column 4: 40% vote + // column 5: 15% vote + // column 6: noone votes + // All columns sum to 100 for simplicity, values chosen by @valardragon semi-arbitrarily, + // feel free to change. + numVotesTransitionMatrix, _ := simulation.CreateTransitionMatrix([][]int{ + {20, 10, 0, 0, 0, 0}, + {55, 50, 20, 10, 0, 0}, + {25, 25, 30, 25, 30, 15}, + {0, 15, 30, 25, 30, 30}, + {0, 0, 20, 30, 30, 30}, + {0, 0, 0, 10, 10, 25}, + }) + + statePercentageArray := []float64{1, .9, .75, .4, .15, 0} + curNumVotesState := 1 + + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + // 1) submit proposal now + content := contentSim(r, ctx, accs) + if content == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSubmitProposal, "content is nil"), nil, nil + } + + simAccount, _ := simtypes.RandomAcc(r, accs) + deposit, skip, err := randomDeposit(r, ctx, ak, bk, k, simAccount.Address) + switch { + case skip: + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSubmitProposal, "skip deposit"), nil, nil + case err != nil: + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgSubmitProposal, "unable to generate deposit"), nil, err + } + + msg, err := types.NewMsgSubmitProposal(content, deposit, simAccount.Address) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate a submit proposal msg"), nil, err + } + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + var fees sdk.Coins + coins, hasNeg := spendable.SafeSub(deposit) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate fees"), nil, err + } + } + + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + simAccount.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err + } + + _, _, err = app.Deliver(txGen.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err + } + + opMsg := simtypes.NewOperationMsg(msg, true, "", nil) + + // get the submitted proposal ID + proposalID, err := k.GetProposalID(ctx) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate proposalID"), nil, err + } + + // 2) Schedule operations for votes + // 2.1) first pick a number of people to vote. + curNumVotesState = numVotesTransitionMatrix.NextState(r, curNumVotesState) + numVotes := int(math.Ceil(float64(len(accs)) * statePercentageArray[curNumVotesState])) + + // 2.2) select who votes and when + whoVotes := r.Perm(len(accs)) + + // didntVote := whoVotes[numVotes:] + whoVotes = whoVotes[:numVotes] + votingPeriod := k.GetVotingParams(ctx).VotingPeriod + + fops := make([]simtypes.FutureOperation, numVotes+1) + for i := 0; i < numVotes; i++ { + whenVote := ctx.BlockHeader().Time.Add(time.Duration(r.Int63n(int64(votingPeriod.Seconds()))) * time.Second) + fops[i] = simtypes.FutureOperation{ + BlockTime: whenVote, + Op: operationSimulateMsgVote(ak, bk, k, accs[whoVotes[i]], int64(proposalID)), + } + } + + return opMsg, fops, nil + } +} + +// SimulateMsgDeposit generates a MsgDeposit with random values. +func SimulateMsgDeposit(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + proposalID, ok := randomProposalID(r, k, ctx, types.StatusDepositPeriod) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDeposit, "unable to generate proposalID"), nil, nil + } + + deposit, skip, err := randomDeposit(r, ctx, ak, bk, k, simAccount.Address) + switch { + case skip: + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDeposit, "skip deposit"), nil, nil + case err != nil: + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDeposit, "unable to generate deposit"), nil, err + } + + msg := types.NewMsgDeposit(simAccount.Address, proposalID, deposit) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + var fees sdk.Coins + coins, hasNeg := spendable.SafeSub(deposit) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate fees"), nil, err + } + } + + txCtx := simulation.OperationInput{ + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTx(txCtx, fees) + } +} + +// SimulateMsgVote generates a MsgVote with random values. +func SimulateMsgVote(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return operationSimulateMsgVote(ak, bk, k, simtypes.Account{}, -1) +} + +func operationSimulateMsgVote(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, + simAccount simtypes.Account, proposalIDInt int64) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if simAccount.Equals(simtypes.Account{}) { + simAccount, _ = simtypes.RandomAcc(r, accs) + } + + var proposalID uint64 + + switch { + case proposalIDInt < 0: + var ok bool + proposalID, ok = randomProposalID(r, k, ctx, types.StatusVotingPeriod) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgVote, "unable to generate proposalID"), nil, nil + } + default: + proposalID = uint64(proposalIDInt) + } + + option := randomVotingOption(r) + msg := types.NewMsgVote(simAccount.Address, proposalID, option) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgVoteWeighted generates a MsgVoteWeighted with random values. +func SimulateMsgVoteWeighted(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return operationSimulateMsgVoteWeighted(ak, bk, k, simtypes.Account{}, -1) +} + +func operationSimulateMsgVoteWeighted(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, + simAccount simtypes.Account, proposalIDInt int64) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if simAccount.Equals(simtypes.Account{}) { + simAccount, _ = simtypes.RandomAcc(r, accs) + } + + var proposalID uint64 + + switch { + case proposalIDInt < 0: + var ok bool + proposalID, ok = randomProposalID(r, k, ctx, types.StatusVotingPeriod) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgVoteWeighted, "unable to generate proposalID"), nil, nil + } + default: + proposalID = uint64(proposalIDInt) + } + + options := randomWeightedVotingOptions(r) + msg := types.NewMsgVoteWeighted(simAccount.Address, proposalID, options) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// Pick a random deposit with a random denomination with a +// deposit amount between (0, min(balance, minDepositAmount)) +// This is to simulate multiple users depositing to get the +// proposal above the minimum deposit amount +func randomDeposit(r *rand.Rand, ctx sdk.Context, + ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, addr sdk.AccAddress, +) (deposit sdk.Coins, skip bool, err error) { + account := ak.GetAccount(ctx, addr) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + if spendable.Empty() { + return nil, true, nil // skip + } + + minDeposit := k.GetDepositParams(ctx).MinDeposit + denomIndex := r.Intn(len(minDeposit)) + denom := minDeposit[denomIndex].Denom + + depositCoins := spendable.AmountOf(denom) + if depositCoins.IsZero() { + return nil, true, nil + } + + maxAmt := depositCoins + if maxAmt.GT(minDeposit[denomIndex].Amount) { + maxAmt = minDeposit[denomIndex].Amount + } + + amount, err := simtypes.RandPositiveInt(r, maxAmt) + if err != nil { + return nil, false, err + } + + return sdk.Coins{sdk.NewCoin(denom, amount)}, false, nil +} + +// Pick a random proposal ID between the initial proposal ID +// (defined in gov GenesisState) and the latest proposal ID +// that matches a given Status. +// It does not provide a default ID. +func randomProposalID(r *rand.Rand, k keeper.Keeper, + ctx sdk.Context, status types.ProposalStatus) (proposalID uint64, found bool) { + proposalID, _ = k.GetProposalID(ctx) + + switch { + case proposalID > initialProposalID: + // select a random ID between [initialProposalID, proposalID] + proposalID = uint64(simtypes.RandIntBetween(r, int(initialProposalID), int(proposalID))) + + default: + // This is called on the first call to this funcion + // in order to update the global variable + initialProposalID = proposalID + } + + proposal, ok := k.GetProposal(ctx, proposalID) + if !ok || proposal.Status != status { + return proposalID, false + } + + return proposalID, true +} + +// Pick a random voting option +func randomVotingOption(r *rand.Rand) types.VoteOption { + switch r.Intn(4) { + case 0: + return types.OptionYes + case 1: + return types.OptionAbstain + case 2: + return types.OptionNo + case 3: + return types.OptionNoWithVeto + default: + panic("invalid vote option") + } +} + +// Pick a random weighted voting options +func randomWeightedVotingOptions(r *rand.Rand) types.WeightedVoteOptions { + w1 := r.Intn(100 + 1) + w2 := r.Intn(100 - w1 + 1) + w3 := r.Intn(100 - w1 - w2 + 1) + w4 := 100 - w1 - w2 - w3 + weightedVoteOptions := types.WeightedVoteOptions{} + if w1 > 0 { + weightedVoteOptions = append(weightedVoteOptions, types.WeightedVoteOption{ + Option: types.OptionYes, + Weight: sdk.NewDecWithPrec(int64(w1), 2), + }) + } + if w2 > 0 { + weightedVoteOptions = append(weightedVoteOptions, types.WeightedVoteOption{ + Option: types.OptionAbstain, + Weight: sdk.NewDecWithPrec(int64(w2), 2), + }) + } + if w3 > 0 { + weightedVoteOptions = append(weightedVoteOptions, types.WeightedVoteOption{ + Option: types.OptionNo, + Weight: sdk.NewDecWithPrec(int64(w3), 2), + }) + } + if w4 > 0 { + weightedVoteOptions = append(weightedVoteOptions, types.WeightedVoteOption{ + Option: types.OptionNoWithVeto, + Weight: sdk.NewDecWithPrec(int64(w4), 2), + }) + } + return weightedVoteOptions +} diff --git a/sei-cosmos/x/gov/simulation/params.go b/sei-cosmos/x/gov/simulation/params.go new file mode 100644 index 0000000000..4ddf5a77c6 --- /dev/null +++ b/sei-cosmos/x/gov/simulation/params.go @@ -0,0 +1,76 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/simulation" +) + +const ( + keyVotingParams = "votingparams" + keyDepositParams = "depositparams" + keyTallyParams = "tallyparams" + subkeyQuorum = "quorum" + subkeyThreshold = "threshold" + subkeyExpeditedThreshold = "expedited_threshold" + subkeyVeto = "veto" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, keyVotingParams, + func(r *rand.Rand) string { + return fmt.Sprintf(`{"voting_period": "%d"}`, GenVotingParamsVotingPeriod(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyVotingParams, + func(r *rand.Rand) string { + return fmt.Sprintf(`{"expedited_voting_period": "%d"}`, GenVotingParamsExpeditedVotingPeriod(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyDepositParams, + func(r *rand.Rand) string { + return fmt.Sprintf(`{"max_deposit_period": "%d"}`, GenDepositParamsDepositPeriod(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyTallyParams, + func(r *rand.Rand) string { + changes := []struct { + key string + value sdk.Dec + }{ + {subkeyQuorum, GenTallyParamsQuorum(r)}, + {subkeyThreshold, GenTallyParamsThreshold(r)}, + {subkeyExpeditedThreshold, GenTallyParamsExpeditedThreshold(r)}, + {subkeyVeto, GenTallyParamsVeto(r)}, + } + + pc := make(map[string]string) + numChanges := simtypes.RandIntBetween(r, 1, len(changes)) + for i := 0; i < numChanges; i++ { + c := changes[r.Intn(len(changes))] + + _, ok := pc[c.key] + for ok { + c := changes[r.Intn(len(changes))] + _, ok = pc[c.key] + } + + pc[c.key] = c.value.String() + } + + bz, _ := json.Marshal(pc) + return string(bz) + }, + ), + } +} diff --git a/sei-cosmos/x/gov/simulation/proposals.go b/sei-cosmos/x/gov/simulation/proposals.go new file mode 100644 index 0000000000..9fab1a826c --- /dev/null +++ b/sei-cosmos/x/gov/simulation/proposals.go @@ -0,0 +1,34 @@ +package simulation + +import ( + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// OpWeightSubmitTextProposal app params key for text proposal +const OpWeightSubmitTextProposal = "op_weight_submit_text_proposal" + +// ProposalContents defines the module weighted proposals' contents +func ProposalContents() []simtypes.WeightedProposalContent { + return []simtypes.WeightedProposalContent{ + simulation.NewWeightedProposalContent( + OpWeightMsgDeposit, + seiappparams.DefaultWeightTextProposal, + SimulateTextProposalContent, + ), + } +} + +// SimulateTextProposalContent returns a random text proposal content. +func SimulateTextProposalContent(r *rand.Rand, _ sdk.Context, _ []simtypes.Account) simtypes.Content { + return types.NewTextProposal( + simtypes.RandStringOfLength(r, 140), + simtypes.RandStringOfLength(r, 5000), + false, + ) +} diff --git a/sei-cosmos/x/params/module.go b/sei-cosmos/x/params/module.go index c606a8cfc5..e728f313fa 100644 --- a/sei-cosmos/x/params/module.go +++ b/sei-cosmos/x/params/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -16,15 +17,18 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/params/client/cli" "github.com/cosmos/cosmos-sdk/x/params/keeper" + "github.com/cosmos/cosmos-sdk/x/params/simulation" "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the params module. @@ -145,3 +149,25 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 2 } + +// ProposalContents returns all the params content functions used to +// simulate governance proposals. +func (am AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return simulation.ProposalContents(simState.ParamChanges) +} + +// RandomizedParams creates randomized distribution param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder doesn't register any type. +func (AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) {} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} + +// GenerateGenesisState performs a no-op. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) {} diff --git a/sei-cosmos/x/params/simulation/operations.go b/sei-cosmos/x/params/simulation/operations.go new file mode 100644 index 0000000000..c29b03bde2 --- /dev/null +++ b/sei-cosmos/x/params/simulation/operations.go @@ -0,0 +1,55 @@ +package simulation + +import ( + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/params/types/proposal" +) + +func min(a int, b int) int { + if a <= b { + return a + } + return b +} + +// SimulateParamChangeProposalContent returns random parameter change content. +// It will generate a ParameterChangeProposal object with anywhere between 1 and +// the total amount of defined parameters changes, all of which have random valid values. +func SimulateParamChangeProposalContent(paramChangePool []simulation.ParamChange) simulation.ContentSimulatorFn { + numProposals := 0 + // Bound the maximum number of simultaneous parameter changes + maxSimultaneousParamChanges := min(len(paramChangePool), 1000) + if maxSimultaneousParamChanges == 0 { + panic("param changes array is empty") + } + + return func(r *rand.Rand, _ sdk.Context, _ []simulation.Account) simulation.Content { + numChanges := simulation.RandIntBetween(r, 1, maxSimultaneousParamChanges) + paramChanges := make([]proposal.ParamChange, numChanges) + + // perm here takes at most len(paramChangePool) calls to random + paramChoices := r.Perm(len(paramChangePool)) + + for i := 0; i < numChanges; i++ { + spc := paramChangePool[paramChoices[i]] + // add a new distinct parameter to the set of changes + paramChanges[i] = proposal.NewParamChange(spc.Subspace(), spc.Key(), spc.SimValue()(r)) + } + + title := fmt.Sprintf("title from SimulateParamChangeProposalContent-%d", numProposals) + desc := fmt.Sprintf("desc from SimulateParamChangeProposalContent-%d. Random short desc: %s", + numProposals, simulation.RandStringOfLength(r, 20)) + isExpedited := r.Intn(3) == 0 // randomly generate some expedited proposal + numProposals++ + return proposal.NewParameterChangeProposal( + title, // title + desc, // description + paramChanges, // set of changes + isExpedited, // is expedited proposal or not + ) + } +} diff --git a/sei-cosmos/x/params/simulation/proposals.go b/sei-cosmos/x/params/simulation/proposals.go new file mode 100644 index 0000000000..3f097488d6 --- /dev/null +++ b/sei-cosmos/x/params/simulation/proposals.go @@ -0,0 +1,21 @@ +package simulation + +import ( + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// OpWeightSubmitParamChangeProposal app params key for param change proposal +const OpWeightSubmitParamChangeProposal = "op_weight_submit_param_change_proposal" + +// ProposalContents defines the module weighted proposals' contents +func ProposalContents(paramChanges []simtypes.ParamChange) []simtypes.WeightedProposalContent { + return []simtypes.WeightedProposalContent{ + simulation.NewWeightedProposalContent( + OpWeightSubmitParamChangeProposal, + seiappparams.DefaultWeightParamChangeProposal, + SimulateParamChangeProposalContent(paramChanges), + ), + } +} diff --git a/sei-cosmos/x/simulation/event_stats.go b/sei-cosmos/x/simulation/event_stats.go new file mode 100644 index 0000000000..0e4289fd24 --- /dev/null +++ b/sei-cosmos/x/simulation/event_stats.go @@ -0,0 +1,55 @@ +package simulation + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" +) + +// EventStats defines an object that keeps a tally of each event that has occurred +// during a simulation. +type EventStats map[string]map[string]map[string]int + +// NewEventStats creates a new empty EventStats object +func NewEventStats() EventStats { + return make(EventStats) +} + +// Tally increases the count of a simulation event. +func (es EventStats) Tally(route, op, evResult string) { + _, ok := es[route] + if !ok { + es[route] = make(map[string]map[string]int) + } + + _, ok = es[route][op] + if !ok { + es[route][op] = make(map[string]int) + } + + es[route][op][evResult]++ +} + +// Print the event stats in JSON format. +func (es EventStats) Print(w io.Writer) { + obj, err := json.MarshalIndent(es, "", " ") + if err != nil { + panic(err) + } + + fmt.Fprintln(w, string(obj)) +} + +// ExportJSON saves the event stats as a JSON file on a given path +func (es EventStats) ExportJSON(path string) { + bz, err := json.MarshalIndent(es, "", " ") + if err != nil { + panic(err) + } + + err = ioutil.WriteFile(path, bz, 0600) + if err != nil { + panic(err) + } +} diff --git a/sei-cosmos/x/simulation/expected_keepers.go b/sei-cosmos/x/simulation/expected_keepers.go new file mode 100644 index 0000000000..c54831b8a4 --- /dev/null +++ b/sei-cosmos/x/simulation/expected_keepers.go @@ -0,0 +1,16 @@ +package simulation + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// AccountKeeper defines the expected account keeper used for simulations (noalias) +type AccountKeeper interface { + GetAccount(ctx sdk.Context, addr sdk.AccAddress) types.AccountI +} + +// BankKeeper defines the expected interface needed to retrieve account balances. +type BankKeeper interface { + SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins +} diff --git a/sei-cosmos/x/simulation/log.go b/sei-cosmos/x/simulation/log.go new file mode 100644 index 0000000000..ba22b2af4a --- /dev/null +++ b/sei-cosmos/x/simulation/log.go @@ -0,0 +1,78 @@ +package simulation + +import ( + "fmt" + "os" + "path" + "time" +) + +// log writter +type LogWriter interface { + AddEntry(OperationEntry) + PrintLogs() +} + +// LogWriter - return a dummy or standard log writer given the testingmode +func NewLogWriter(testingmode bool) LogWriter { + if !testingmode { + return &DummyLogWriter{} + } + + return &StandardLogWriter{} +} + +// log writter +type StandardLogWriter struct { + OpEntries []OperationEntry `json:"op_entries" yaml:"op_entries"` +} + +// add an entry to the log writter +func (lw *StandardLogWriter) AddEntry(opEntry OperationEntry) { + lw.OpEntries = append(lw.OpEntries, opEntry) +} + +// PrintLogs - print the logs to a simulation file +func (lw *StandardLogWriter) PrintLogs() { + f := createLogFile() + defer f.Close() + + for i := 0; i < len(lw.OpEntries); i++ { + writeEntry := fmt.Sprintf("%s\n", (lw.OpEntries[i]).MustMarshal()) + _, err := f.WriteString(writeEntry) + + if err != nil { + panic("Failed to write logs to file") + } + } +} + +func createLogFile() *os.File { + var f *os.File + + fileName := fmt.Sprintf("%s.log", time.Now().Format("2006-01-02_15:04:05")) + folderPath := path.Join(os.ExpandEnv("$HOME"), ".simapp", "simulations") + filePath := path.Join(folderPath, fileName) + + err := os.MkdirAll(folderPath, os.ModePerm) + if err != nil { + panic(err) + } + + f, err = os.Create(filePath) + if err != nil { + panic(err) + } + fmt.Printf("Logs to writing to %s\n", filePath) + + return f +} + +// dummy log writter +type DummyLogWriter struct{} + +// do nothing +func (lw *DummyLogWriter) AddEntry(_ OperationEntry) {} + +// do nothing +func (lw *DummyLogWriter) PrintLogs() {} diff --git a/sei-cosmos/x/simulation/mock_tendermint.go b/sei-cosmos/x/simulation/mock_tendermint.go new file mode 100644 index 0000000000..bac06c106c --- /dev/null +++ b/sei-cosmos/x/simulation/mock_tendermint.go @@ -0,0 +1,218 @@ +package simulation + +import ( + "fmt" + "math/rand" + "sort" + "testing" + "time" + + abci "github.com/tendermint/tendermint/abci/types" + cryptoenc "github.com/tendermint/tendermint/crypto/encoding" + tmbytes "github.com/tendermint/tendermint/libs/bytes" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" +) + +type mockValidator struct { + val abci.ValidatorUpdate + livenessState int +} + +func (mv mockValidator) String() string { + return fmt.Sprintf("mockValidator{%s power:%v state:%v}", + mv.val.PubKey.String(), + mv.val.Power, + mv.livenessState) +} + +type mockValidators map[string]mockValidator + +// get mockValidators from abci validators +func newMockValidators(r *rand.Rand, abciVals []abci.ValidatorUpdate, params Params) mockValidators { + validators := make(mockValidators) + + for _, validator := range abciVals { + str := fmt.Sprintf("%X", validator.PubKey.GetEd25519()) + liveliness := GetMemberOfInitialState(r, params.InitialLivenessWeightings()) + + validators[str] = mockValidator{ + val: validator, + livenessState: liveliness, + } + } + + return validators +} + +// TODO describe usage +func (vals mockValidators) getKeys() []string { + keys := make([]string, len(vals)) + i := 0 + + for key := range vals { + keys[i] = key + i++ + } + + sort.Strings(keys) + + return keys +} + +// randomProposer picks a random proposer from the current validator set +func (vals mockValidators) randomProposer(r *rand.Rand) tmbytes.HexBytes { + keys := vals.getKeys() + if len(keys) == 0 { + return nil + } + + key := keys[r.Intn(len(keys))] + + proposer := vals[key].val + pk, err := cryptoenc.PubKeyFromProto(proposer.PubKey) + if err != nil { //nolint:wsl + panic(err) + } + + return pk.Address() +} + +// updateValidators mimics Tendermint's update logic. +func updateValidators( + tb testing.TB, + r *rand.Rand, + params Params, + current map[string]mockValidator, + updates []abci.ValidatorUpdate, + event func(route, op, evResult string), +) map[string]mockValidator { + + for _, update := range updates { + str := fmt.Sprintf("%X", update.PubKey.GetEd25519()) + + if update.Power == 0 { + if _, ok := current[str]; !ok { + tb.Fatalf("tried to delete a nonexistent validator: %s", str) + } + + event("end_block", "validator_updates", "kicked") + delete(current, str) + } else if _, ok := current[str]; ok { + // validator already exists + event("end_block", "validator_updates", "updated") + + } else { + // Set this new validator + current[str] = mockValidator{ + update, + GetMemberOfInitialState(r, params.InitialLivenessWeightings()), + } + event("end_block", "validator_updates", "added") + } + } + + return current +} + +// RandomRequestBeginBlock generates a list of signing validators according to +// the provided list of validators, signing fraction, and evidence fraction +func RandomRequestBeginBlock(r *rand.Rand, params Params, + validators mockValidators, pastTimes []time.Time, + pastVoteInfos [][]abci.VoteInfo, + event func(route, op, evResult string), header tmproto.Header) abci.RequestBeginBlock { + if len(validators) == 0 { + return abci.RequestBeginBlock{ + Header: header, + } + } + + voteInfos := make([]abci.VoteInfo, len(validators)) + + for i, key := range validators.getKeys() { + mVal := validators[key] + mVal.livenessState = params.LivenessTransitionMatrix().NextState(r, mVal.livenessState) + signed := true + + if mVal.livenessState == 1 { + // spotty connection, 50% probability of success + // See https://github.com/golang/go/issues/23804#issuecomment-365370418 + // for reasoning behind computing like this + signed = r.Int63()%2 == 0 + } else if mVal.livenessState == 2 { + // offline + signed = false + } + + if signed { + event("begin_block", "signing", "signed") + } else { + event("begin_block", "signing", "missed") + } + + pubkey, err := cryptoenc.PubKeyFromProto(mVal.val.PubKey) + if err != nil { + panic(err) + } + + voteInfos[i] = abci.VoteInfo{ + Validator: abci.Validator{ + Address: pubkey.Address(), + Power: mVal.val.Power, + }, + SignedLastBlock: signed, + } + } + + // return if no past times + if len(pastTimes) == 0 { + return abci.RequestBeginBlock{ + Header: header, + LastCommitInfo: abci.LastCommitInfo{ + Votes: voteInfos, + }, + } + } + + // TODO: Determine capacity before allocation + evidence := make([]abci.Evidence, 0) + + for r.Float64() < params.EvidenceFraction() { + height := header.Height + time := header.Time + vals := voteInfos + + if r.Float64() < params.PastEvidenceFraction() && header.Height > 1 { + height = int64(r.Intn(int(header.Height)-1)) + 1 // Tendermint starts at height 1 + // array indices offset by one + time = pastTimes[height-1] + vals = pastVoteInfos[height-1] + } + + validator := vals[r.Intn(len(vals))].Validator + + var totalVotingPower int64 + for _, val := range vals { + totalVotingPower += val.Validator.Power + } + + evidence = append(evidence, + abci.Evidence{ + Type: abci.MisbehaviorType_DUPLICATE_VOTE, + Validator: validator, + Height: height, + Time: time, + TotalVotingPower: totalVotingPower, + }, + ) + + event("begin_block", "evidence", "ok") + } + + return abci.RequestBeginBlock{ + Header: header, + LastCommitInfo: abci.LastCommitInfo{ + Votes: voteInfos, + }, + ByzantineValidators: evidence, + } +} diff --git a/sei-cosmos/x/simulation/operation.go b/sei-cosmos/x/simulation/operation.go new file mode 100644 index 0000000000..7aab48e9fb --- /dev/null +++ b/sei-cosmos/x/simulation/operation.go @@ -0,0 +1,158 @@ +package simulation + +import ( + "encoding/json" + "math/rand" + "sort" + + "github.com/cosmos/cosmos-sdk/types/simulation" +) + +// entry kinds for use within OperationEntry +const ( + BeginBlockEntryKind = "begin_block" + EndBlockEntryKind = "end_block" + MsgEntryKind = "msg" + QueuedMsgEntryKind = "queued_msg" +) + +// OperationEntry - an operation entry for logging (ex. BeginBlock, EndBlock, XxxMsg, etc) +type OperationEntry struct { + EntryKind string `json:"entry_kind" yaml:"entry_kind"` + Height int64 `json:"height" yaml:"height"` + Order int64 `json:"order" yaml:"order"` + Operation json.RawMessage `json:"operation" yaml:"operation"` +} + +// NewOperationEntry creates a new OperationEntry instance +func NewOperationEntry(entry string, height, order int64, op json.RawMessage) OperationEntry { + return OperationEntry{ + EntryKind: entry, + Height: height, + Order: order, + Operation: op, + } +} + +// BeginBlockEntry - operation entry for begin block +func BeginBlockEntry(height int64) OperationEntry { + return NewOperationEntry(BeginBlockEntryKind, height, -1, nil) +} + +// EndBlockEntry - operation entry for end block +func EndBlockEntry(height int64) OperationEntry { + return NewOperationEntry(EndBlockEntryKind, height, -1, nil) +} + +// MsgEntry - operation entry for standard msg +func MsgEntry(height, order int64, opMsg simulation.OperationMsg) OperationEntry { + return NewOperationEntry(MsgEntryKind, height, order, opMsg.MustMarshal()) +} + +// QueuedMsgEntry creates an operation entry for a given queued message. +func QueuedMsgEntry(height int64, opMsg simulation.OperationMsg) OperationEntry { + return NewOperationEntry(QueuedMsgEntryKind, height, -1, opMsg.MustMarshal()) +} + +// MustMarshal marshals the operation entry, panic on error. +func (oe OperationEntry) MustMarshal() json.RawMessage { + out, err := json.Marshal(oe) + if err != nil { + panic(err) + } + + return out +} + +// OperationQueue defines an object for a queue of operations +type OperationQueue map[int][]simulation.Operation + +// NewOperationQueue creates a new OperationQueue instance. +func NewOperationQueue() OperationQueue { + return make(OperationQueue) +} + +// queueOperations adds all future operations into the operation queue. +func queueOperations(queuedOps OperationQueue, queuedTimeOps []simulation.FutureOperation, futureOps []simulation.FutureOperation) { + if futureOps == nil { + return + } + + for _, futureOp := range futureOps { + futureOp := futureOp + if futureOp.BlockHeight != 0 { + if val, ok := queuedOps[futureOp.BlockHeight]; ok { + queuedOps[futureOp.BlockHeight] = append(val, futureOp.Op) + } else { + queuedOps[futureOp.BlockHeight] = []simulation.Operation{futureOp.Op} + } + + continue + } + + // TODO: Replace with proper sorted data structure, so don't have the + // copy entire slice + index := sort.Search( + len(queuedTimeOps), + func(i int) bool { + return queuedTimeOps[i].BlockTime.After(futureOp.BlockTime) + }, + ) + + queuedTimeOps = append(queuedTimeOps, simulation.FutureOperation{}) + copy(queuedTimeOps[index+1:], queuedTimeOps[index:]) + queuedTimeOps[index] = futureOp + } +} + +// WeightedOperation is an operation with associated weight. +// This is used to bias the selection operation within the simulator. +type WeightedOperation struct { + weight int + op simulation.Operation +} + +func (w WeightedOperation) Weight() int { + return w.weight +} + +func (w WeightedOperation) Op() simulation.Operation { + return w.op +} + +// NewWeightedOperation creates a new WeightedOperation instance +func NewWeightedOperation(weight int, op simulation.Operation) WeightedOperation { + return WeightedOperation{ + weight: weight, + op: op, + } +} + +// WeightedOperations is the group of all weighted operations to simulate. +type WeightedOperations []simulation.WeightedOperation + +func (ops WeightedOperations) totalWeight() int { + totalOpWeight := 0 + for _, op := range ops { + totalOpWeight += op.Weight() + } + + return totalOpWeight +} + +func (ops WeightedOperations) getSelectOpFn() simulation.SelectOpFn { + totalOpWeight := ops.totalWeight() + + return func(r *rand.Rand) simulation.Operation { + x := r.Intn(totalOpWeight) + for i := 0; i < len(ops); i++ { + if x <= ops[i].Weight() { + return ops[i].Op() + } + + x -= ops[i].Weight() + } + // shouldn't happen + return ops[0].Op() + } +} diff --git a/sei-cosmos/x/simulation/params.go b/sei-cosmos/x/simulation/params.go new file mode 100644 index 0000000000..acc7d9b6d8 --- /dev/null +++ b/sei-cosmos/x/simulation/params.go @@ -0,0 +1,182 @@ +package simulation + +import ( + "encoding/json" + "fmt" + "math/rand" + + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/simulation" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +const ( + // Minimum time per block + minTimePerBlock int64 = 10000 / 2 + + // Maximum time per block + maxTimePerBlock int64 = 10000 +) + +// TODO: explain transitional matrix usage +var ( + // Currently there are 3 different liveness types, + // fully online, spotty connection, offline. + defaultLivenessTransitionMatrix, _ = CreateTransitionMatrix([][]int{ + {90, 20, 1}, + {10, 50, 5}, + {0, 10, 1000}, + }) + + // 3 states: rand in range [0, 4*provided blocksize], + // rand in range [0, 2 * provided blocksize], 0 + defaultBlockSizeTransitionMatrix, _ = CreateTransitionMatrix([][]int{ + {85, 5, 0}, + {15, 92, 1}, + {0, 3, 99}, + }) +) + +// Params define the parameters necessary for running the simulations +type Params struct { + pastEvidenceFraction float64 + numKeys int + evidenceFraction float64 + initialLivenessWeightings []int + livenessTransitionMatrix simulation.TransitionMatrix + blockSizeTransitionMatrix simulation.TransitionMatrix +} + +func (p Params) PastEvidenceFraction() float64 { + return p.pastEvidenceFraction +} + +func (p Params) NumKeys() int { + return p.numKeys +} + +func (p Params) EvidenceFraction() float64 { + return p.evidenceFraction +} + +func (p Params) InitialLivenessWeightings() []int { + return p.initialLivenessWeightings +} + +func (p Params) LivenessTransitionMatrix() simulation.TransitionMatrix { + return p.livenessTransitionMatrix +} + +func (p Params) BlockSizeTransitionMatrix() simulation.TransitionMatrix { + return p.blockSizeTransitionMatrix +} + +// RandomParams returns random simulation parameters +func RandomParams(r *rand.Rand) Params { + return Params{ + pastEvidenceFraction: r.Float64(), + numKeys: simulation.RandIntBetween(r, 2, 2500), // number of accounts created for the simulation + evidenceFraction: r.Float64(), + initialLivenessWeightings: []int{simulation.RandIntBetween(r, 1, 80), r.Intn(10), r.Intn(10)}, + livenessTransitionMatrix: defaultLivenessTransitionMatrix, + blockSizeTransitionMatrix: defaultBlockSizeTransitionMatrix, + } +} + +// Param change proposals + +// ParamChange defines the object used for simulating parameter change proposals +type ParamChange struct { + subspace string + key string + simValue simulation.SimValFn +} + +func (spc ParamChange) Subspace() string { + return spc.subspace +} + +func (spc ParamChange) Key() string { + return spc.key +} + +func (spc ParamChange) SimValue() simulation.SimValFn { + return spc.simValue +} + +// NewSimParamChange creates a new ParamChange instance +func NewSimParamChange(subspace, key string, simVal simulation.SimValFn) simulation.ParamChange { + return ParamChange{ + subspace: subspace, + key: key, + simValue: simVal, + } +} + +// ComposedKey creates a new composed key for the param change proposal +func (spc ParamChange) ComposedKey() string { + return spc.Subspace() + "/" + spc.Key() +} + +// Proposal Contents + +// WeightedProposalContent defines a common struct for proposal contents defined by +// external modules (i.e outside gov) +type WeightedProposalContent struct { + appParamsKey string // key used to retrieve the value of the weight from the simulation application params + defaultWeight int // default weight + contentSimulatorFn simulation.ContentSimulatorFn // content simulator function +} + +func NewWeightedProposalContent(appParamsKey string, defaultWeight int, contentSimulatorFn simulation.ContentSimulatorFn) simulation.WeightedProposalContent { + return &WeightedProposalContent{appParamsKey: appParamsKey, defaultWeight: defaultWeight, contentSimulatorFn: contentSimulatorFn} +} + +func (w WeightedProposalContent) AppParamsKey() string { + return w.appParamsKey +} + +func (w WeightedProposalContent) DefaultWeight() int { + return w.defaultWeight +} + +func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulatorFn { + return w.contentSimulatorFn +} + +// Param change proposals + +// randomConsensusParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. +func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSONCodec) *tmproto.ConsensusParams { + var genesisState map[string]json.RawMessage + err := json.Unmarshal(appState, &genesisState) + if err != nil { + panic(err) + } + + stakingGenesisState := stakingtypes.GetGenesisStateFromAppState(cdc, genesisState) + consensusParams := &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ + MaxBytes: int64(simulation.RandIntBetween(r, 20000000, 30000000)), + MaxGas: -1, + }, + Validator: &tmproto.ValidatorParams{ + PubKeyTypes: []string{types.ABCIPubKeyTypeEd25519}, + }, + Evidence: &tmproto.EvidenceParams{ + MaxAgeNumBlocks: int64(stakingGenesisState.Params.UnbondingTime / AverageBlockTime), + MaxAgeDuration: stakingGenesisState.Params.UnbondingTime, + }, + } + + bz, err := json.MarshalIndent(&consensusParams, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated consensus parameters:\n%s\n", bz) + + return consensusParams +} diff --git a/sei-cosmos/x/simulation/simulate.go b/sei-cosmos/x/simulation/simulate.go new file mode 100644 index 0000000000..3b580a176c --- /dev/null +++ b/sei-cosmos/x/simulation/simulate.go @@ -0,0 +1,390 @@ +package simulation + +import ( + "context" + "fmt" + "io" + "math/rand" + "os" + "os/signal" + "syscall" + "testing" + "time" + + abci "github.com/tendermint/tendermint/abci/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/utils" +) + +const AverageBlockTime = 6 * time.Second + +// initialize the chain for the simulation +func initChain( + r *rand.Rand, + params Params, + accounts []simulation.Account, + app *baseapp.BaseApp, + appStateFn simulation.AppStateFn, + config simulation.Config, + cdc codec.JSONCodec, +) (mockValidators, time.Time, []simulation.Account, string) { + + appState, accounts, chainID, genesisTimestamp := appStateFn(r, accounts, config) + consensusParams := randomConsensusParams(r, appState, cdc) + req := abci.RequestInitChain{ + AppStateBytes: appState, + ChainId: chainID, + ConsensusParams: consensusParams, + Time: genesisTimestamp, + } + res, _ := app.InitChain(context.Background(), &req) + validators := newMockValidators(r, utils.Map(res.Validators, func(v abci.ValidatorUpdate) abci.ValidatorUpdate { + return abci.ValidatorUpdate{ + PubKey: v.PubKey, + Power: v.Power, + } + }), params) + + return validators, genesisTimestamp, accounts, chainID +} + +// SimulateFromSeed tests an application by running the provided +// operations, testing the provided invariants, but using the provided config.Seed. +// TODO: split this monster function up +func SimulateFromSeed( + tb testing.TB, + w io.Writer, + app *baseapp.BaseApp, + appStateFn simulation.AppStateFn, + randAccFn simulation.RandomAccountFn, + ops WeightedOperations, + blockedAddrs map[string]bool, + config simulation.Config, + cdc codec.JSONCodec, +) (stopEarly bool, exportedParams Params, err error) { + // in case we have to end early, don't os.Exit so that we can run cleanup code. + testingMode, _, b := getTestingMode(tb) + + fmt.Fprintf(w, "Starting SimulateFromSeed with randomness created with seed %d\n", int(config.Seed)) + r := rand.New(rand.NewSource(config.Seed)) + params := RandomParams(r) + fmt.Fprintf(w, "Randomized simulation params: \n%s\n", mustMarshalJSONIndent(params)) + + timeDiff := maxTimePerBlock - minTimePerBlock + accs := randAccFn(r, params.NumKeys()) + eventStats := NewEventStats() + + // Second variable to keep pending validator set (delayed one block since + // TM 0.24) Initially this is the same as the initial validator set + validators, genesisTimestamp, accs, chainID := initChain(r, params, accs, app, appStateFn, config, cdc) + if len(accs) == 0 { + return true, params, fmt.Errorf("must have greater than zero genesis accounts") + } + + config.ChainID = chainID + + fmt.Printf( + "Starting the simulation from time %v (unixtime %v)\n", + genesisTimestamp.UTC().Format(time.UnixDate), genesisTimestamp.Unix(), + ) + + // remove module account address if they exist in accs + var tmpAccs []simulation.Account + + for _, acc := range accs { + if !blockedAddrs[acc.Address.String()] { + tmpAccs = append(tmpAccs, acc) + } + } + + accs = tmpAccs + nextValidators := validators + + header := tmproto.Header{ + ChainID: config.ChainID, + Height: 1, + Time: genesisTimestamp, + ProposerAddress: validators.randomProposer(r), + } + opCount := 0 + + // Setup code to catch SIGTERM's + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) + + go func() { + receivedSignal := <-c + fmt.Fprintf(w, "\nExiting early due to %s, on block %d, operation %d\n", receivedSignal, header.Height, opCount) + err = fmt.Errorf("exited due to %s", receivedSignal) + stopEarly = true + }() + + var ( + pastTimes []time.Time + pastVoteInfos [][]abci.VoteInfo + ) + + request := RandomRequestBeginBlock(r, params, + validators, pastTimes, pastVoteInfos, eventStats.Tally, header) + + // These are operations which have been queued by previous operations + operationQueue := NewOperationQueue() + + var timeOperationQueue []simulation.FutureOperation + + logWriter := NewLogWriter(testingMode) + + blockSimulator := createBlockSimulator( + testingMode, tb, w, params, eventStats.Tally, + ops, operationQueue, timeOperationQueue, logWriter, config) + + if !testingMode { + b.ResetTimer() + } else { + // recover logs in case of panic + defer func() { + if r := recover(); r != nil { + _, _ = fmt.Fprintf(w, "simulation halted due to panic on block %d\n", header.Height) + logWriter.PrintLogs() + panic(r) + } + }() + } + + // set exported params to the initial state + if config.ExportParamsPath != "" && config.ExportParamsHeight == 0 { + exportedParams = params + } + + // TODO: split up the contents of this for loop into new functions + for height := config.InitialBlockHeight; height < config.NumBlocks+config.InitialBlockHeight && !stopEarly; height++ { + + // Log the header time for future lookup + pastTimes = append(pastTimes, header.Time) + pastVoteInfos = append(pastVoteInfos, request.LastCommitInfo.Votes) + + // Run the BeginBlock handler + logWriter.AddEntry(BeginBlockEntry(int64(height))) + app.FinalizeBlock(context.Background(), &abci.RequestFinalizeBlock{}) + + ctx := app.NewContext(false, header) + + // Run queued operations. Ignores blocksize if blocksize is too small + numQueuedOpsRan := runQueuedOperations( + operationQueue, int(header.Height), tb, r, app, ctx, accs, logWriter, + eventStats.Tally, config.Lean, config.ChainID, + ) + + numQueuedTimeOpsRan := runQueuedTimeOperations( + timeOperationQueue, int(header.Height), header.Time, + tb, r, app, ctx, accs, logWriter, eventStats.Tally, + config.Lean, config.ChainID, + ) + + // run standard operations + operations := blockSimulator(r, app, ctx, accs, header) + opCount += operations + numQueuedOpsRan + numQueuedTimeOpsRan + + res, _ := app.FinalizeBlock(context.Background(), &abci.RequestFinalizeBlock{}) + header.Height++ + header.Time = header.Time.Add( + time.Duration(minTimePerBlock) * time.Second) + header.Time = header.Time.Add( + time.Duration(int64(r.Intn(int(timeDiff)))) * time.Second) + header.ProposerAddress = validators.randomProposer(r) + + logWriter.AddEntry(EndBlockEntry(int64(height))) + + if config.Commit { + app.Commit(context.Background()) + } + + if header.ProposerAddress == nil { + fmt.Fprintf(w, "\nSimulation stopped early as all validators have been unbonded; nobody left to propose a block!\n") + stopEarly = true + break + } + + // Generate a random RequestBeginBlock with the current validator set + // for the next block + request = RandomRequestBeginBlock(r, params, validators, pastTimes, pastVoteInfos, eventStats.Tally, header) + + // Update the validator set, which will be reflected in the application + // on the next block + validators = nextValidators + nextValidators = updateValidators(tb, r, params, validators, res.ValidatorUpdates, eventStats.Tally) + + // update the exported params + if config.ExportParamsPath != "" && config.ExportParamsHeight == height { + exportedParams = params + } + } + + if stopEarly { + if config.ExportStatsPath != "" { + fmt.Println("Exporting simulation statistics...") + eventStats.ExportJSON(config.ExportStatsPath) + } else { + eventStats.Print(w) + } + + return true, exportedParams, err + } + + fmt.Fprintf( + w, + "\nSimulation complete; Final height (blocks): %d, final time (seconds): %v, operations ran: %d\n", + header.Height, header.Time, opCount, + ) + + if config.ExportStatsPath != "" { + fmt.Println("Exporting simulation statistics...") + eventStats.ExportJSON(config.ExportStatsPath) + } else { + eventStats.Print(w) + } + + return false, exportedParams, nil +} + +type blockSimFn func(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accounts []simulation.Account, header tmproto.Header) (opCount int) + +// Returns a function to simulate blocks. Written like this to avoid constant +// parameters being passed everytime, to minimize memory overhead. +func createBlockSimulator(testingMode bool, tb testing.TB, w io.Writer, params Params, + event func(route, op, evResult string), ops WeightedOperations, + operationQueue OperationQueue, timeOperationQueue []simulation.FutureOperation, + logWriter LogWriter, config simulation.Config) blockSimFn { + + lastBlockSizeState := 0 // state for [4 * uniform distribution] + blocksize := 0 + selectOp := ops.getSelectOpFn() + + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accounts []simulation.Account, header tmproto.Header, + ) (opCount int) { + _, _ = fmt.Fprintf( + w, "\rSimulating... block %d/%d, operation %d/%d.", + header.Height, config.NumBlocks, opCount, blocksize, + ) + lastBlockSizeState, blocksize = getBlockSize(r, params, lastBlockSizeState, config.BlockSize) + + type opAndR struct { + op simulation.Operation + rand *rand.Rand + } + + opAndRz := make([]opAndR, 0, blocksize) + + // Predetermine the blocksize slice so that we can do things like block + // out certain operations without changing the ops that follow. + for i := 0; i < blocksize; i++ { + opAndRz = append(opAndRz, opAndR{ + op: selectOp(r), + rand: simulation.DeriveRand(r), + }) + } + + for i := 0; i < blocksize; i++ { + // NOTE: the Rand 'r' should not be used here. + opAndR := opAndRz[i] + op, r2 := opAndR.op, opAndR.rand + opMsg, futureOps, err := op(r2, app, ctx, accounts, config.ChainID) + opMsg.LogEvent(event) + + if !config.Lean || opMsg.OK { + logWriter.AddEntry(MsgEntry(header.Height, int64(i), opMsg)) + } + + if err != nil { + logWriter.PrintLogs() + tb.Fatalf(`error on block %d/%d, operation (%d/%d) from x/%s: +%v +Comment: %s`, + header.Height, config.NumBlocks, opCount, blocksize, opMsg.Route, err, opMsg.Comment) + } + + queueOperations(operationQueue, timeOperationQueue, futureOps) + + if testingMode && opCount%50 == 0 { + fmt.Fprintf(w, "\rSimulating... block %d/%d, operation %d/%d. ", + header.Height, config.NumBlocks, opCount, blocksize) + } + + opCount++ + } + + return opCount + } +} + +// nolint: errcheck +func runQueuedOperations(queueOps map[int][]simulation.Operation, + height int, tb testing.TB, r *rand.Rand, app *baseapp.BaseApp, + ctx sdk.Context, accounts []simulation.Account, logWriter LogWriter, + event func(route, op, evResult string), lean bool, chainID string) (numOpsRan int) { + + queuedOp, ok := queueOps[height] + if !ok { + return 0 + } + + numOpsRan = len(queuedOp) + for i := 0; i < numOpsRan; i++ { + + // For now, queued operations cannot queue more operations. + // If a need arises for us to support queued messages to queue more messages, this can + // be changed. + opMsg, _, err := queuedOp[i](r, app, ctx, accounts, chainID) + opMsg.LogEvent(event) + + if !lean || opMsg.OK { + logWriter.AddEntry((QueuedMsgEntry(int64(height), opMsg))) + } + + if err != nil { + logWriter.PrintLogs() + tb.FailNow() + } + } + delete(queueOps, height) + + return numOpsRan +} + +func runQueuedTimeOperations(queueOps []simulation.FutureOperation, + height int, currentTime time.Time, tb testing.TB, r *rand.Rand, + app *baseapp.BaseApp, ctx sdk.Context, accounts []simulation.Account, + logWriter LogWriter, event func(route, op, evResult string), + lean bool, chainID string) (numOpsRan int) { + + numOpsRan = 0 + for len(queueOps) > 0 && currentTime.After(queueOps[0].BlockTime) { + + // For now, queued operations cannot queue more operations. + // If a need arises for us to support queued messages to queue more messages, this can + // be changed. + opMsg, _, err := queueOps[0].Op(r, app, ctx, accounts, chainID) + opMsg.LogEvent(event) + + if !lean || opMsg.OK { + logWriter.AddEntry(QueuedMsgEntry(int64(height), opMsg)) + } + + if err != nil { + logWriter.PrintLogs() + tb.FailNow() + } + + queueOps = queueOps[1:] + numOpsRan++ + } + + return numOpsRan +} diff --git a/sei-cosmos/x/simulation/transition_matrix.go b/sei-cosmos/x/simulation/transition_matrix.go new file mode 100644 index 0000000000..9e2c69c066 --- /dev/null +++ b/sei-cosmos/x/simulation/transition_matrix.go @@ -0,0 +1,80 @@ +package simulation + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/types/simulation" +) + +// TransitionMatrix is _almost_ a left stochastic matrix. It is technically +// not one due to not normalizing the column values. In the future, if we want +// to find the steady state distribution, it will be quite easy to normalize +// these values to get a stochastic matrix. Floats aren't currently used as +// the default due to non-determinism across architectures +type TransitionMatrix struct { + weights [][]int + // total in each column + totals []int + n int +} + +// CreateTransitionMatrix creates a transition matrix from the provided weights. +// TODO: Provide example usage +func CreateTransitionMatrix(weights [][]int) (simulation.TransitionMatrix, error) { + n := len(weights) + for i := 0; i < n; i++ { + if len(weights[i]) != n { + return TransitionMatrix{}, + fmt.Errorf("transition matrix: non-square matrix provided, error on row %d", i) + } + } + + totals := make([]int, n) + + for row := 0; row < n; row++ { + for col := 0; col < n; col++ { + totals[col] += weights[row][col] + } + } + + return TransitionMatrix{weights, totals, n}, nil +} + +// NextState returns the next state randomly chosen using r, and the weightings +// provided in the transition matrix. +func (t TransitionMatrix) NextState(r *rand.Rand, i int) int { + randNum := r.Intn(t.totals[i]) + for row := 0; row < t.n; row++ { + if randNum < t.weights[row][i] { + return row + } + + randNum -= t.weights[row][i] + } + // This line should never get executed + return -1 +} + +// GetMemberOfInitialState takes an initial array of weights, of size n. +// It returns a weighted random number in [0,n). +func GetMemberOfInitialState(r *rand.Rand, weights []int) int { + n := len(weights) + total := 0 + + for i := 0; i < n; i++ { + total += weights[i] + } + + randNum := r.Intn(total) + + for state := 0; state < n; state++ { + if randNum < weights[state] { + return state + } + + randNum -= weights[state] + } + // This line should never get executed + return -1 +} diff --git a/sei-cosmos/x/simulation/util.go b/sei-cosmos/x/simulation/util.go new file mode 100644 index 0000000000..02773e2189 --- /dev/null +++ b/sei-cosmos/x/simulation/util.go @@ -0,0 +1,190 @@ +package simulation + +import ( + "encoding/json" + "fmt" + "math/rand" + "testing" + "time" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authsign "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +const DefaultGenTxGas = 10000000 + +func getTestingMode(tb testing.TB) (testingMode bool, t *testing.T, b *testing.B) { + testingMode = false + + if _t, ok := tb.(*testing.T); ok { + t = _t + testingMode = true + } else { + b = tb.(*testing.B) + } + + return testingMode, t, b +} + +// getBlockSize returns a block size as determined from the transition matrix. +// It targets making average block size the provided parameter. The three +// states it moves between are: +// - "over stuffed" blocks with average size of 2 * avgblocksize, +// - normal sized blocks, hitting avgBlocksize on average, +// - and empty blocks, with no txs / only txs scheduled from the past. +func getBlockSize(r *rand.Rand, params Params, lastBlockSizeState, avgBlockSize int) (state, blockSize int) { + // TODO: Make default blocksize transition matrix actually make the average + // blocksize equal to avgBlockSize. + state = params.BlockSizeTransitionMatrix().NextState(r, lastBlockSizeState) + + switch state { + case 0: + blockSize = r.Intn(avgBlockSize * 4) + + case 1: + blockSize = r.Intn(avgBlockSize * 2) + + default: + blockSize = 0 + } + + return state, blockSize +} + +func mustMarshalJSONIndent(o interface{}) []byte { + bz, err := json.MarshalIndent(o, "", " ") + if err != nil { + panic(fmt.Sprintf("failed to JSON encode: %s", err)) + } + + return bz +} + +// OperationInput is a struct that holds all the needed values to generate a tx and deliver it +type OperationInput struct { + R *rand.Rand + App *baseapp.BaseApp + TxGen client.TxConfig + Cdc *codec.ProtoCodec + Msg sdk.Msg + MsgType string + CoinsSpentInMsg sdk.Coins + Context sdk.Context + SimAccount simtypes.Account + AccountKeeper AccountKeeper + Bankkeeper BankKeeper + ModuleName string +} + +// GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. +func GenAndDeliverTxWithRandFees(txCtx OperationInput) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) + spendable := txCtx.Bankkeeper.SpendableCoins(txCtx.Context, account.GetAddress()) + + var fees sdk.Coins + var err error + + coins, hasNeg := spendable.SafeSub(txCtx.CoinsSpentInMsg) + if hasNeg { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "message doesn't leave room for fees"), nil, err + } + + fees, err = simtypes.RandomFees(txCtx.R, txCtx.Context, coins) + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to generate fees"), nil, err + } + return GenAndDeliverTx(txCtx, fees) +} + +// GenAndDeliverTx generates a transactions and delivers it. +func GenAndDeliverTx(txCtx OperationInput, fees sdk.Coins) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) + tx, err := GenTx( + txCtx.TxGen, + []sdk.Msg{txCtx.Msg}, + fees, + DefaultGenTxGas, + txCtx.Context.ChainID(), + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + txCtx.SimAccount.PrivKey, + ) + + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to generate mock tx"), nil, err + } + + _, _, err = txCtx.App.Deliver(txCtx.TxGen.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to deliver tx"), nil, err + } + + return simtypes.NewOperationMsg(txCtx.Msg, true, "", txCtx.Cdc), nil, nil + +} + +func GenTx(gen client.TxConfig, msgs []sdk.Msg, feeAmt sdk.Coins, gas uint64, chainID string, accNums, accSeqs []uint64, priv ...cryptotypes.PrivKey) (sdk.Tx, error) { + sigs := make([]signing.SignatureV2, len(priv)) + + // create a random length memo + r := rand.New(rand.NewSource(time.Now().UnixNano())) + + memo := simtypes.RandStringOfLength(r, simtypes.RandIntBetween(r, 0, 100)) + + signMode := gen.SignModeHandler().DefaultMode() + + // 1st round: set SignatureV2 with empty signatures, to set correct + // signer infos. + for i, p := range priv { + sigs[i] = signing.SignatureV2{ + PubKey: p.PubKey(), + Data: &signing.SingleSignatureData{ + SignMode: signMode, + }, + Sequence: accSeqs[i], + } + } + + tx := gen.NewTxBuilder() + err := tx.SetMsgs(msgs...) + if err != nil { + return nil, err + } + err = tx.SetSignatures(sigs...) + if err != nil { + return nil, err + } + tx.SetMemo(memo) + tx.SetFeeAmount(feeAmt) + tx.SetGasLimit(gas) + + // 2nd round: once all signer infos are set, every signer can sign. + for i, p := range priv { + signerData := authsign.SignerData{ + ChainID: chainID, + AccountNumber: accNums[i], + Sequence: accSeqs[i], + } + signBytes, err := gen.SignModeHandler().GetSignBytes(signMode, signerData, tx.GetTx()) + if err != nil { + panic(err) + } + sig, err := p.Sign(signBytes) + if err != nil { + panic(err) + } + sigs[i].Data.(*signing.SingleSignatureData).Signature = sig + err = tx.SetSignatures(sigs...) + if err != nil { + panic(err) + } + } + + return tx.GetTx(), nil +} diff --git a/sei-cosmos/x/slashing/module.go b/sei-cosmos/x/slashing/module.go index e8aa4a467c..4f84e6da13 100644 --- a/sei-cosmos/x/slashing/module.go +++ b/sei-cosmos/x/slashing/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -17,15 +18,18 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/slashing/client/cli" "github.com/cosmos/cosmos-sdk/x/slashing/client/rest" "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + "github.com/cosmos/cosmos-sdk/x/slashing/simulation" "github.com/cosmos/cosmos-sdk/x/slashing/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the slashing module. @@ -178,3 +182,33 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 4 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the slashing module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized slashing param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for slashing module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the slashing module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, + am.accountKeeper, am.bankKeeper, am.keeper, am.stakingKeeper, + ) +} diff --git a/sei-cosmos/x/slashing/simulation/decoder.go b/sei-cosmos/x/slashing/simulation/decoder.go new file mode 100644 index 0000000000..5f3eaa6d60 --- /dev/null +++ b/sei-cosmos/x/slashing/simulation/decoder.go @@ -0,0 +1,44 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding slashing type. +func NewDecodeStore(cdc codec.BinaryCodec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.ValidatorSigningInfoKeyPrefix): + var infoA, infoB types.ValidatorSigningInfo + cdc.MustUnmarshal(kvA.Value, &infoA) + cdc.MustUnmarshal(kvB.Value, &infoB) + return fmt.Sprintf("%v\n%v", infoA, infoB) + + case bytes.Equal(kvA.Key[:1], types.ValidatorMissedBlockBitArrayKeyPrefix): + var missedA, missedB types.ValidatorMissedBlockArray + cdc.MustUnmarshal(kvA.Value, &missedA) + cdc.MustUnmarshal(kvB.Value, &missedB) + return fmt.Sprintf("missedA: %v\nmissedB: %v", missedA, missedB) + + case bytes.Equal(kvA.Key[:1], types.AddrPubkeyRelationKeyPrefix): + var pubKeyA, pubKeyB cryptotypes.PubKey + if err := cdc.UnmarshalInterface(kvA.Value, &pubKeyA); err != nil { + panic(fmt.Sprint("Can't unmarshal kvA; ", err)) + } + if err := cdc.UnmarshalInterface(kvB.Value, &pubKeyB); err != nil { + panic(fmt.Sprint("Can't unmarshal kvB; ", err)) + } + return fmt.Sprintf("PubKeyA: %s\nPubKeyB: %s", pubKeyA, pubKeyB) + + default: + panic(fmt.Sprintf("invalid slashing key prefix %X", kvA.Key[:1])) + } + } +} diff --git a/sei-cosmos/x/slashing/simulation/genesis.go b/sei-cosmos/x/slashing/simulation/genesis.go new file mode 100644 index 0000000000..8dc1d79dbb --- /dev/null +++ b/sei-cosmos/x/slashing/simulation/genesis.go @@ -0,0 +1,96 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +// Simulation parameter constants +const ( + SignedBlocksWindow = "signed_blocks_window" + MinSignedPerWindow = "min_signed_per_window" + DowntimeJailDuration = "downtime_jail_duration" + SlashFractionDoubleSign = "slash_fraction_double_sign" + SlashFractionDowntime = "slash_fraction_downtime" +) + +// GenSignedBlocksWindow randomized SignedBlocksWindow +func GenSignedBlocksWindow(r *rand.Rand) int64 { + return int64(simulation.RandIntBetween(r, 10, 1000)) +} + +// GenMinSignedPerWindow randomized MinSignedPerWindow +func GenMinSignedPerWindow(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(r.Intn(10)), 1) +} + +// GenDowntimeJailDuration randomized DowntimeJailDuration +func GenDowntimeJailDuration(r *rand.Rand) time.Duration { + return time.Duration(simulation.RandIntBetween(r, 60, 60*60*24)) * time.Second +} + +// GenSlashFractionDoubleSign randomized SlashFractionDoubleSign +func GenSlashFractionDoubleSign(r *rand.Rand) sdk.Dec { + return sdk.NewDec(1).Quo(sdk.NewDec(int64(r.Intn(50) + 1))) +} + +// GenSlashFractionDowntime randomized SlashFractionDowntime +func GenSlashFractionDowntime(r *rand.Rand) sdk.Dec { + return sdk.NewDec(1).Quo(sdk.NewDec(int64(r.Intn(200) + 1))) +} + +// RandomizedGenState generates a random GenesisState for slashing +func RandomizedGenState(simState *module.SimulationState) { + var signedBlocksWindow int64 + simState.AppParams.GetOrGenerate( + simState.Cdc, SignedBlocksWindow, &signedBlocksWindow, simState.Rand, + func(r *rand.Rand) { signedBlocksWindow = GenSignedBlocksWindow(r) }, + ) + + var minSignedPerWindow sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, MinSignedPerWindow, &minSignedPerWindow, simState.Rand, + func(r *rand.Rand) { minSignedPerWindow = GenMinSignedPerWindow(r) }, + ) + + var downtimeJailDuration time.Duration + simState.AppParams.GetOrGenerate( + simState.Cdc, DowntimeJailDuration, &downtimeJailDuration, simState.Rand, + func(r *rand.Rand) { downtimeJailDuration = GenDowntimeJailDuration(r) }, + ) + + var slashFractionDoubleSign sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, SlashFractionDoubleSign, &slashFractionDoubleSign, simState.Rand, + func(r *rand.Rand) { slashFractionDoubleSign = GenSlashFractionDoubleSign(r) }, + ) + + var slashFractionDowntime sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, SlashFractionDowntime, &slashFractionDowntime, simState.Rand, + func(r *rand.Rand) { slashFractionDowntime = GenSlashFractionDowntime(r) }, + ) + + params := types.NewParams( + signedBlocksWindow, minSignedPerWindow, downtimeJailDuration, + slashFractionDoubleSign, slashFractionDowntime, + ) + + slashingGenesis := types.NewGenesisState(params, []types.SigningInfo{}, []types.ValidatorMissedBlockArray{}) + + bz, err := json.MarshalIndent(&slashingGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated slashing parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(slashingGenesis) +} diff --git a/sei-cosmos/x/slashing/simulation/operations.go b/sei-cosmos/x/slashing/simulation/operations.go new file mode 100644 index 0000000000..a42197463f --- /dev/null +++ b/sei-cosmos/x/slashing/simulation/operations.go @@ -0,0 +1,135 @@ +package simulation + +import ( + "errors" + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// Simulation operation weights constants +const ( + OpWeightMsgUnjail = "op_weight_msg_unjail" +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, + bk types.BankKeeper, k keeper.Keeper, sk types.StakingKeeper, +) simulation.WeightedOperations { + + var weightMsgUnjail int + appParams.GetOrGenerate(cdc, OpWeightMsgUnjail, &weightMsgUnjail, nil, + func(_ *rand.Rand) { + weightMsgUnjail = seiappparams.DefaultWeightMsgUnjail + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgUnjail, + SimulateMsgUnjail(ak, bk, k, sk.(stakingkeeper.Keeper)), + ), + } +} + +// SimulateMsgUnjail generates a MsgUnjail with random values +func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, + accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + + validator, ok := stakingkeeper.RandomValidator(r, sk, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "validator is not ok"), nil, nil // skip + } + + simAccount, found := simtypes.FindAccount(accs, sdk.AccAddress(validator.GetOperator())) + if !found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to find account"), nil, nil // skip + } + + if !validator.IsJailed() { + // TODO: due to this condition this message is almost, if not always, skipped ! + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "validator is not jailed"), nil, nil + } + + consAddr, err := validator.GetConsAddr() + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to get validator consensus key"), nil, err + } + info, found := k.GetValidatorSigningInfo(ctx, consAddr) + if !found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to find validator signing info"), nil, nil // skip + } + + selfDel := sk.Delegation(ctx, simAccount.Address, validator.GetOperator()) + if selfDel == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "self delegation is nil"), nil, nil // skip + } + + account := ak.GetAccount(ctx, sdk.AccAddress(validator.GetOperator())) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + fees, err := simtypes.RandomFees(r, ctx, spendable) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to generate fees"), nil, err + } + + msg := types.NewMsgUnjail(validator.GetOperator()) + + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + simAccount.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err + } + + _, res, err := app.Deliver(txGen.TxEncoder(), tx) + + // result should fail if: + // - validator cannot be unjailed due to tombstone + // - validator is still in jailed period + // - self delegation too low + if info.Tombstoned || + ctx.BlockHeader().Time.Before(info.JailedUntil) || + validator.TokensFromShares(selfDel.GetShares()).TruncateInt().LT(validator.GetMinSelfDelegation()) { + if res != nil && err == nil { + if info.Tombstoned { + return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator should not have been unjailed if validator tombstoned") + } + if ctx.BlockHeader().Time.Before(info.JailedUntil) { + return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator unjailed while validator still in jail period") + } + if validator.TokensFromShares(selfDel.GetShares()).TruncateInt().LT(validator.GetMinSelfDelegation()) { + return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator unjailed even though self-delegation too low") + } + } + // msg failed as expected + return simtypes.NewOperationMsg(msg, false, "", nil), nil, nil + } + + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, errors.New(res.Log) + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} diff --git a/sei-cosmos/x/slashing/simulation/params.go b/sei-cosmos/x/slashing/simulation/params.go new file mode 100644 index 0000000000..e7c8fcf491 --- /dev/null +++ b/sei-cosmos/x/slashing/simulation/params.go @@ -0,0 +1,40 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +const ( + keySignedBlocksWindow = "SignedBlocksWindow" + keyMinSignedPerWindow = "MinSignedPerWindow" + keySlashFractionDowntime = "SlashFractionDowntime" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, keySignedBlocksWindow, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenSignedBlocksWindow(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keyMinSignedPerWindow, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenMinSignedPerWindow(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, keySlashFractionDowntime, + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenSlashFractionDowntime(r)) + }, + ), + } +} diff --git a/sei-cosmos/x/staking/keeper/grpc_query.go b/sei-cosmos/x/staking/keeper/grpc_query.go index 8fa16354d4..4abcf9c919 100644 --- a/sei-cosmos/x/staking/keeper/grpc_query.go +++ b/sei-cosmos/x/staking/keeper/grpc_query.go @@ -390,6 +390,7 @@ func (k Querier) Redelegations(c context.Context, req *types.QueryRedelegationsR switch { case req.DelegatorAddr != "" && req.SrcValidatorAddr != "" && req.DstValidatorAddr != "": redels, err = queryRedelegation(ctx, k, req) + pageRes = &query.PageResponse{} case req.DelegatorAddr == "" && req.SrcValidatorAddr != "" && req.DstValidatorAddr == "": redels, pageRes, err = queryRedelegationsFromSrcValidator(store, k, req) default: diff --git a/sei-cosmos/x/staking/module.go b/sei-cosmos/x/staking/module.go index f1ee1ff2d3..fed6a657ce 100644 --- a/sei-cosmos/x/staking/module.go +++ b/sei-cosmos/x/staking/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -16,15 +17,18 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" "github.com/cosmos/cosmos-sdk/x/staking/client/rest" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/simulation" "github.com/cosmos/cosmos-sdk/x/staking/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the staking module. @@ -177,3 +181,32 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 2 } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the staking module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized staking param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for staking module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the staking module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.keeper, + ) +} diff --git a/sei-cosmos/x/staking/simulation/decoder.go b/sei-cosmos/x/staking/simulation/decoder.go new file mode 100644 index 0000000000..eec0ce22a0 --- /dev/null +++ b/sei-cosmos/x/staking/simulation/decoder.go @@ -0,0 +1,64 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding staking type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.LastTotalPowerKey): + var powerA, powerB sdk.IntProto + + cdc.MustUnmarshal(kvA.Value, &powerA) + cdc.MustUnmarshal(kvB.Value, &powerB) + + return fmt.Sprintf("%v\n%v", powerA, powerB) + case bytes.Equal(kvA.Key[:1], types.ValidatorsKey): + var validatorA, validatorB types.Validator + + cdc.MustUnmarshal(kvA.Value, &validatorA) + cdc.MustUnmarshal(kvB.Value, &validatorB) + + return fmt.Sprintf("%v\n%v", validatorA, validatorB) + case bytes.Equal(kvA.Key[:1], types.LastValidatorPowerKey), + bytes.Equal(kvA.Key[:1], types.ValidatorsByConsAddrKey), + bytes.Equal(kvA.Key[:1], types.ValidatorsByPowerIndexKey): + return fmt.Sprintf("%v\n%v", sdk.ValAddress(kvA.Value), sdk.ValAddress(kvB.Value)) + + case bytes.Equal(kvA.Key[:1], types.DelegationKey): + var delegationA, delegationB types.Delegation + + cdc.MustUnmarshal(kvA.Value, &delegationA) + cdc.MustUnmarshal(kvB.Value, &delegationB) + + return fmt.Sprintf("%v\n%v", delegationA, delegationB) + case bytes.Equal(kvA.Key[:1], types.UnbondingDelegationKey), + bytes.Equal(kvA.Key[:1], types.UnbondingDelegationByValIndexKey): + var ubdA, ubdB types.UnbondingDelegation + + cdc.MustUnmarshal(kvA.Value, &ubdA) + cdc.MustUnmarshal(kvB.Value, &ubdB) + + return fmt.Sprintf("%v\n%v", ubdA, ubdB) + case bytes.Equal(kvA.Key[:1], types.RedelegationKey), + bytes.Equal(kvA.Key[:1], types.RedelegationByValSrcIndexKey): + var redA, redB types.Redelegation + + cdc.MustUnmarshal(kvA.Value, &redA) + cdc.MustUnmarshal(kvB.Value, &redB) + + return fmt.Sprintf("%v\n%v", redA, redB) + default: + panic(fmt.Sprintf("invalid staking key prefix %X", kvA.Key[:1])) + } + } +} diff --git a/sei-cosmos/x/staking/simulation/genesis.go b/sei-cosmos/x/staking/simulation/genesis.go new file mode 100644 index 0000000000..f033fbcda1 --- /dev/null +++ b/sei-cosmos/x/staking/simulation/genesis.go @@ -0,0 +1,119 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Simulation parameter constants +const ( + unbondingTime = "unbonding_time" + maxValidators = "max_validators" + historicalEntries = "historical_entries" +) + +// genUnbondingTime returns randomized UnbondingTime +func genUnbondingTime(r *rand.Rand) (ubdTime time.Duration) { + return time.Duration(simulation.RandIntBetween(r, 60, 60*60*24*3*2)) * time.Second +} + +// genMaxValidators returns randomized MaxValidators +func genMaxValidators(r *rand.Rand) (maxValidators uint32) { + return uint32(r.Intn(250) + 1) +} + +// getHistEntries returns randomized HistoricalEntries between 0-100. +func getHistEntries(r *rand.Rand) uint32 { + return uint32(r.Intn(int(types.DefaultHistoricalEntries + 1))) +} + +// RandomizedGenState generates a random GenesisState for staking +func RandomizedGenState(simState *module.SimulationState) { + // params + var ( + unbondTime time.Duration + maxVals uint32 + histEntries uint32 + minCommissionRate sdk.Dec + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, unbondingTime, &unbondTime, simState.Rand, + func(r *rand.Rand) { unbondTime = genUnbondingTime(r) }, + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, maxValidators, &maxVals, simState.Rand, + func(r *rand.Rand) { maxVals = genMaxValidators(r) }, + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, historicalEntries, &histEntries, simState.Rand, + func(r *rand.Rand) { histEntries = getHistEntries(r) }, + ) + + // NOTE: the slashing module need to be defined after the staking module on the + // NewSimulationManager constructor for this to work + simState.UnbondTime = unbondTime + params := types.NewParams( + simState.UnbondTime, + maxVals, + 7, + histEntries, + sdk.DefaultBondDenom, + minCommissionRate, + sdk.MustNewDecFromStr(sdk.DefaultMaxVotingPowerRatio), + sdk.NewIntFromUint64(sdk.DefaultMaxVotingPowerEnforcementThreshold), + ) + + // validators & delegations + var ( + validators []types.Validator + delegations []types.Delegation + ) + + valAddrs := make([]sdk.ValAddress, simState.NumBonded) + + for i := 0; i < int(simState.NumBonded); i++ { + valAddr := sdk.ValAddress(simState.Accounts[i].Address) + valAddrs[i] = valAddr + + maxCommission := sdk.NewDecWithPrec(int64(simulation.RandIntBetween(simState.Rand, 1, 100)), 2) + commission := types.NewCommission( + simulation.RandomDecAmount(simState.Rand, maxCommission), + maxCommission, + simulation.RandomDecAmount(simState.Rand, maxCommission), + ) + + validator, err := types.NewValidator(valAddr, simState.Accounts[i].ConsKey.PubKey(), types.Description{}) + if err != nil { + panic(err) + } + validator.Tokens = sdk.NewInt(simState.InitialStake) + validator.DelegatorShares = sdk.NewDec(simState.InitialStake) + validator.Commission = commission + + delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDec(simState.InitialStake)) + + validators = append(validators, validator) + delegations = append(delegations, delegation) + } + + stakingGenesis := types.NewGenesisState(params, validators, delegations) + + bz, err := json.MarshalIndent(&stakingGenesis.Params, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated staking parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(stakingGenesis) +} diff --git a/sei-cosmos/x/staking/simulation/operations.go b/sei-cosmos/x/staking/simulation/operations.go new file mode 100644 index 0000000000..c2462f5032 --- /dev/null +++ b/sei-cosmos/x/staking/simulation/operations.go @@ -0,0 +1,473 @@ +package simulation + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/types" + seiappparams "github.com/sei-protocol/sei-chain/app/params" +) + +// Simulation operation weights constants +const ( + OpWeightMsgCreateValidator = "op_weight_msg_create_validator" + OpWeightMsgEditValidator = "op_weight_msg_edit_validator" + OpWeightMsgDelegate = "op_weight_msg_delegate" + OpWeightMsgUndelegate = "op_weight_msg_undelegate" + OpWeightMsgBeginRedelegate = "op_weight_msg_begin_redelegate" +) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, + bk types.BankKeeper, k keeper.Keeper, +) simulation.WeightedOperations { + var ( + weightMsgCreateValidator int + weightMsgEditValidator int + weightMsgDelegate int + weightMsgUndelegate int + weightMsgBeginRedelegate int + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgCreateValidator, &weightMsgCreateValidator, nil, + func(_ *rand.Rand) { + weightMsgCreateValidator = seiappparams.DefaultWeightMsgCreateValidator + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgEditValidator, &weightMsgEditValidator, nil, + func(_ *rand.Rand) { + weightMsgEditValidator = seiappparams.DefaultWeightMsgEditValidator + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgDelegate, &weightMsgDelegate, nil, + func(_ *rand.Rand) { + weightMsgDelegate = seiappparams.DefaultWeightMsgDelegate + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgUndelegate, &weightMsgUndelegate, nil, + func(_ *rand.Rand) { + weightMsgUndelegate = seiappparams.DefaultWeightMsgUndelegate + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgBeginRedelegate, &weightMsgBeginRedelegate, nil, + func(_ *rand.Rand) { + weightMsgBeginRedelegate = seiappparams.DefaultWeightMsgBeginRedelegate + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgCreateValidator, + SimulateMsgCreateValidator(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgEditValidator, + SimulateMsgEditValidator(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgDelegate, + SimulateMsgDelegate(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgUndelegate, + SimulateMsgUndelegate(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgBeginRedelegate, + SimulateMsgBeginRedelegate(ak, bk, k), + ), + } +} + +// SimulateMsgCreateValidator generates a MsgCreateValidator with random values +func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + address := sdk.ValAddress(simAccount.Address) + + // ensure the validator doesn't exist already + _, found := k.GetValidator(ctx, address) + if found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "unable to find validator"), nil, nil + } + + denom := k.GetParams(ctx).BondDenom + + balance := bk.GetBalance(ctx, simAccount.Address, denom).Amount + if !balance.IsPositive() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "balance is negative"), nil, nil + } + + amount, err := simtypes.RandPositiveInt(r, balance) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "unable to generate positive amount"), nil, err + } + + selfDelegation := sdk.NewCoin(denom, amount) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + var fees sdk.Coins + + coins, hasNeg := spendable.SafeSub(sdk.Coins{selfDelegation}) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "unable to generate fees"), nil, err + } + } + + description := types.NewDescription( + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + ) + + maxCommission := sdk.NewDecWithPrec(int64(simtypes.RandIntBetween(r, 5, 100)), 2) + commission := types.NewCommissionRates( + simtypes.RandomDecAmount(r, maxCommission), + maxCommission, + simtypes.RandomDecAmount(r, maxCommission), + ) + + msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to create CreateValidator message"), nil, err + } + + txCtx := simulation.OperationInput{ + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTx(txCtx, fees) + } +} + +// SimulateMsgEditValidator generates a MsgEditValidator with random values +func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if len(k.GetAllValidators(ctx)) == 0 { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgEditValidator, "number of validators equal zero"), nil, nil + } + + val, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgEditValidator, "unable to pick a validator"), nil, nil + } + + address := val.GetOperator() + + newCommissionRate := simtypes.RandomDecAmount(r, val.Commission.MaxRate) + + if err := val.Commission.ValidateNewRate(newCommissionRate, ctx.BlockHeader().Time); err != nil { + // skip as the commission is invalid + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgEditValidator, "invalid commission rate"), nil, nil + } + + simAccount, found := simtypes.FindAccount(accs, sdk.AccAddress(val.GetOperator())) + if !found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgEditValidator, "unable to find account"), nil, fmt.Errorf("validator %s not found", val.GetOperator()) + } + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + description := types.NewDescription( + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + simtypes.RandStringOfLength(r, 10), + ) + + msg := types.NewMsgEditValidator(address, description, &newCommissionRate, nil) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgDelegate generates a MsgDelegate with random values +func SimulateMsgDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + denom := k.GetParams(ctx).BondDenom + + if len(k.GetAllValidators(ctx)) == 0 { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "number of validators equal zero"), nil, nil + } + + simAccount, _ := simtypes.RandomAcc(r, accs) + val, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "unable to pick a validator"), nil, nil + } + + if val.InvalidExRate() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "validator's invalid echange rate"), nil, nil + } + + amount := bk.GetBalance(ctx, simAccount.Address, denom).Amount + if !amount.IsPositive() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "balance is negative"), nil, nil + } + + amount, err := simtypes.RandPositiveInt(r, amount) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "unable to generate positive amount"), nil, err + } + + bondAmt := sdk.NewCoin(denom, amount) + + account := ak.GetAccount(ctx, simAccount.Address) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + var fees sdk.Coins + + coins, hasNeg := spendable.SafeSub(sdk.Coins{bondAmt}) + if !hasNeg { + fees, err = simtypes.RandomFees(r, ctx, coins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "unable to generate fees"), nil, err + } + } + + msg := types.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) + + txCtx := simulation.OperationInput{ + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTx(txCtx, fees) + } +} + +// SimulateMsgUndelegate generates a MsgUndelegate with random values +func SimulateMsgUndelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + // get random validator + validator, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "validator is not ok"), nil, nil + } + + valAddr := validator.GetOperator() + delegations := k.GetValidatorDelegations(ctx, validator.GetOperator()) + if delegations == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "keeper does have any delegation entries"), nil, nil + } + + // get random delegator from validator + delegation := delegations[r.Intn(len(delegations))] + delAddr := delegation.GetDelegatorAddr() + + if k.HasMaxUnbondingDelegationEntries(ctx, delAddr, valAddr) { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "keeper does have a max unbonding delegation entries"), nil, nil + } + + totalBond := validator.TokensFromShares(delegation.GetShares()).TruncateInt() + if !totalBond.IsPositive() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "total bond is negative"), nil, nil + } + + unbondAmt, err := simtypes.RandPositiveInt(r, totalBond) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "invalid unbond amount"), nil, err + } + + if unbondAmt.IsZero() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "unbond amount is zero"), nil, nil + } + + msg := types.NewMsgUndelegate( + delAddr, valAddr, sdk.NewCoin(k.BondDenom(ctx), unbondAmt), + ) + + // need to retrieve the simulation account associated with delegation to retrieve PrivKey + var simAccount simtypes.Account + + for _, simAcc := range accs { + if simAcc.Address.Equals(delAddr) { + simAccount = simAcc + break + } + } + // if simaccount.PrivKey == nil, delegation address does not exist in accs. Return error + if simAccount.PrivKey == nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "account private key is nil"), nil, fmt.Errorf("delegation addr: %s does not exist in simulation accounts", delAddr) + } + + account := ak.GetAccount(ctx, delAddr) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgBeginRedelegate generates a MsgBeginRedelegate with random values +func SimulateMsgBeginRedelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + // get random source validator + srcVal, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "unable to pick validator"), nil, nil + } + + srcAddr := srcVal.GetOperator() + delegations := k.GetValidatorDelegations(ctx, srcAddr) + if delegations == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "keeper does have any delegation entries"), nil, nil + } + + // get random delegator from src validator + delegation := delegations[r.Intn(len(delegations))] + delAddr := delegation.GetDelegatorAddr() + + if k.HasReceivingRedelegation(ctx, delAddr, srcAddr) { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "receveing redelegation is not allowed"), nil, nil // skip + } + + // get random destination validator + destVal, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "unable to pick validator"), nil, nil + } + + destAddr := destVal.GetOperator() + if srcAddr.Equals(destAddr) || destVal.InvalidExRate() || k.HasMaxRedelegationEntries(ctx, delAddr, srcAddr, destAddr) { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "checks failed"), nil, nil + } + + totalBond := srcVal.TokensFromShares(delegation.GetShares()).TruncateInt() + if !totalBond.IsPositive() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "total bond is negative"), nil, nil + } + + redAmt, err := simtypes.RandPositiveInt(r, totalBond) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "unable to generate positive amount"), nil, err + } + + if redAmt.IsZero() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "amount is zero"), nil, nil + } + + // check if the shares truncate to zero + shares, err := srcVal.SharesFromTokens(redAmt) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "invalid shares"), nil, err + } + + if srcVal.TokensFromShares(shares).TruncateInt().IsZero() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "shares truncate to zero"), nil, nil // skip + } + + // need to retrieve the simulation account associated with delegation to retrieve PrivKey + var simAccount simtypes.Account + + for _, simAcc := range accs { + if simAcc.Address.Equals(delAddr) { + simAccount = simAcc + break + } + } + + // if simaccount.PrivKey == nil, delegation address does not exist in accs. Return error + if simAccount.PrivKey == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgBeginRedelegate, "account private key is nil"), nil, fmt.Errorf("delegation addr: %s does not exist in simulation accounts", delAddr) + } + + account := ak.GetAccount(ctx, delAddr) + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + + msg := types.NewMsgBeginRedelegate( + delAddr, srcAddr, destAddr, + sdk.NewCoin(k.BondDenom(ctx), redAmt), + ) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} diff --git a/sei-cosmos/x/staking/simulation/params.go b/sei-cosmos/x/staking/simulation/params.go new file mode 100644 index 0000000000..30789d3467 --- /dev/null +++ b/sei-cosmos/x/staking/simulation/params.go @@ -0,0 +1,34 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.KeyMaxValidators), + func(r *rand.Rand) string { + return fmt.Sprintf("%d", genMaxValidators(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyUnbondingTime), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", genUnbondingTime(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyHistoricalEntries), + func(r *rand.Rand) string { + return fmt.Sprintf("%d", getHistEntries(r)) + }, + ), + } +} diff --git a/sei-db/ss/pebbledb/db.go b/sei-db/ss/pebbledb/db.go index fdd21b775a..282f484bd2 100644 --- a/sei-db/ss/pebbledb/db.go +++ b/sei-db/ss/pebbledb/db.go @@ -201,8 +201,11 @@ func (db *Database) Close() error { _ = db.streamHandler.Close() db.streamHandler = nil } - err := db.storage.Close() - db.storage = nil + var err error + if db.storage != nil { + err = db.storage.Close() + db.storage = nil + } return err } diff --git a/sei-db/ss/rocksdb/db.go b/sei-db/ss/rocksdb/db.go index d11c611b92..0d0648e47d 100644 --- a/sei-db/ss/rocksdb/db.go +++ b/sei-db/ss/rocksdb/db.go @@ -504,9 +504,11 @@ func (db *Database) Close() error { // Only set to nil after background goroutine has finished db.streamHandler = nil } - db.storage.Close() - db.storage = nil db.cfHandle = nil + if db.storage != nil { + db.storage.Close() + db.storage = nil + } return nil } diff --git a/sei-db/ss/test/storage_test_suite.go b/sei-db/ss/test/storage_test_suite.go index 4cfaf638ca..932d7d4f15 100644 --- a/sei-db/ss/test/storage_test_suite.go +++ b/sei-db/ss/test/storage_test_suite.go @@ -27,13 +27,14 @@ type StorageTestSuite struct { Config config.StateStoreConfig } -func (s *StorageTestSuite) TestDatabaseClose() { +func (s *StorageTestSuite) TestDatabaseClose_IsIdempotent() { db, err := s.NewDB(s.T().TempDir(), s.Config) s.Require().NoError(err) s.Require().NoError(db.Close()) - - // close should not be idempotent - s.Require().Panics(func() { _ = db.Close() }) + // The close operation on an already closed db should be a noop, because: + // 1. it avoids panic in cases where the db closure may be called multiple times in the call stack. + // 2. it is harmless to make it idempotent and adheres with Go SDK's IO package Close behavior. + s.Require().NoError(db.Close()) } func (s *StorageTestSuite) TestDatabaseLatestVersion() { diff --git a/sei-ibc-go/modules/apps/transfer/module.go b/sei-ibc-go/modules/apps/transfer/module.go index 8825add962..7307f8a901 100644 --- a/sei-ibc-go/modules/apps/transfer/module.go +++ b/sei-ibc-go/modules/apps/transfer/module.go @@ -4,12 +4,14 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -17,6 +19,7 @@ import ( "github.com/cosmos/ibc-go/v3/modules/apps/transfer/client/cli" "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper" + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/simulation" "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" ) @@ -173,3 +176,30 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the transfer module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized ibc-transfer param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for transfer module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.keeper) +} + +// WeightedOperations returns the all the transfer module operations with their respective weights. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/sei-ibc-go/modules/apps/transfer/simulation/decoder.go b/sei-ibc-go/modules/apps/transfer/simulation/decoder.go new file mode 100644 index 0000000000..8758d90454 --- /dev/null +++ b/sei-ibc-go/modules/apps/transfer/simulation/decoder.go @@ -0,0 +1,34 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/types/kv" + + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" +) + +// TransferUnmarshaler defines the expected encoding store functions. +type TransferUnmarshaler interface { + MustUnmarshalDenomTrace([]byte) types.DenomTrace +} + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding DenomTrace type. +func NewDecodeStore(cdc TransferUnmarshaler) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.PortKey): + return fmt.Sprintf("Port A: %s\nPort B: %s", string(kvA.Value), string(kvB.Value)) + + case bytes.Equal(kvA.Key[:1], types.DenomTraceKey): + denomTraceA := cdc.MustUnmarshalDenomTrace(kvA.Value) + denomTraceB := cdc.MustUnmarshalDenomTrace(kvB.Value) + return fmt.Sprintf("DenomTrace A: %s\nDenomTrace B: %s", denomTraceA.IBCDenom(), denomTraceB.IBCDenom()) + + default: + panic(fmt.Sprintf("invalid %s key prefix %X", types.ModuleName, kvA.Key[:1])) + } + } +} diff --git a/sei-ibc-go/modules/apps/transfer/simulation/genesis.go b/sei-ibc-go/modules/apps/transfer/simulation/genesis.go new file mode 100644 index 0000000000..a74277d167 --- /dev/null +++ b/sei-ibc-go/modules/apps/transfer/simulation/genesis.go @@ -0,0 +1,55 @@ +package simulation + +import ( + "encoding/json" + "fmt" + "math/rand" + "strings" + + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" +) + +// Simulation parameter constants +const port = "port_id" + +// RadomEnabled randomized send or receive enabled param with 75% prob of being true. +func RadomEnabled(r *rand.Rand) bool { + return r.Int63n(101) <= 75 +} + +// RandomizedGenState generates a random GenesisState for transfer. +func RandomizedGenState(simState *module.SimulationState) { + var portID string + simState.AppParams.GetOrGenerate( + simState.Cdc, port, &portID, simState.Rand, + func(r *rand.Rand) { portID = strings.ToLower(simtypes.RandStringOfLength(r, 20)) }, + ) + + var sendEnabled bool + simState.AppParams.GetOrGenerate( + simState.Cdc, string(types.KeySendEnabled), &sendEnabled, simState.Rand, + func(r *rand.Rand) { sendEnabled = RadomEnabled(r) }, + ) + + var receiveEnabled bool + simState.AppParams.GetOrGenerate( + simState.Cdc, string(types.KeyReceiveEnabled), &receiveEnabled, simState.Rand, + func(r *rand.Rand) { receiveEnabled = RadomEnabled(r) }, + ) + + transferGenesis := types.GenesisState{ + PortId: portID, + DenomTraces: types.Traces{}, + Params: types.NewParams(sendEnabled, receiveEnabled), + } + + bz, err := json.MarshalIndent(&transferGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&transferGenesis) +} diff --git a/sei-ibc-go/modules/apps/transfer/simulation/params.go b/sei-ibc-go/modules/apps/transfer/simulation/params.go new file mode 100644 index 0000000000..c7193b4719 --- /dev/null +++ b/sei-ibc-go/modules/apps/transfer/simulation/params.go @@ -0,0 +1,31 @@ +package simulation + +import ( + "fmt" + "math/rand" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + gogotypes "github.com/gogo/protobuf/types" + + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.KeySendEnabled), + func(r *rand.Rand) string { + sendEnabled := RadomEnabled(r) + return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: sendEnabled})) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyReceiveEnabled), + func(r *rand.Rand) string { + receiveEnabled := RadomEnabled(r) + return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: receiveEnabled})) + }, + ), + } +} diff --git a/sei-ibc-go/modules/apps/transfer/types/address_test.go b/sei-ibc-go/modules/apps/transfer/types/address_test.go index 5b810f7321..0536d15a1b 100644 --- a/sei-ibc-go/modules/apps/transfer/types/address_test.go +++ b/sei-ibc-go/modules/apps/transfer/types/address_test.go @@ -1,9 +1,11 @@ package types import ( + "testing" + "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "testing" ) func TestSeiAddressHandler_GetSeiAddressFromString(t *testing.T) { @@ -20,9 +22,9 @@ func TestSeiAddressHandler_GetSeiAddressFromString(t *testing.T) { { name: "returns address if address is valid", args: args{ - address: types.AccAddress("address").String(), + address: sdk.MustAccAddressFromBech32("sei1k73v0ec39mxdgr3wnayy3x4t5w7pdncanxk9sr").String(), }, - want: types.AccAddress("address"), + want: sdk.MustAccAddressFromBech32("sei1k73v0ec39mxdgr3wnayy3x4t5w7pdncanxk9sr"), }, { name: "returns error if address is invalid", diff --git a/sei-ibc-go/modules/core/module.go b/sei-ibc-go/modules/core/module.go index d12cd44cbf..c00b6f333f 100644 --- a/sei-ibc-go/modules/core/module.go +++ b/sei-ibc-go/modules/core/module.go @@ -4,12 +4,14 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -23,12 +25,14 @@ import ( host "github.com/cosmos/ibc-go/v3/modules/core/24-host" "github.com/cosmos/ibc-go/v3/modules/core/client/cli" "github.com/cosmos/ibc-go/v3/modules/core/keeper" + "github.com/cosmos/ibc-go/v3/modules/core/simulation" "github.com/cosmos/ibc-go/v3/modules/core/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the ibc module. @@ -189,3 +193,30 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the ibc module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams returns nil since IBC doesn't register parameter changes. +func (AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for ibc module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[host.StoreKey] = simulation.NewDecodeStore(*am.keeper) +} + +// WeightedOperations returns the all the ibc module operations with their respective weights. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/sei-ibc-go/modules/core/simulation/decoder.go b/sei-ibc-go/modules/core/simulation/decoder.go new file mode 100644 index 0000000000..16869f1b06 --- /dev/null +++ b/sei-ibc-go/modules/core/simulation/decoder.go @@ -0,0 +1,33 @@ +package simulation + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/types/kv" + + clientsim "github.com/cosmos/ibc-go/v3/modules/core/02-client/simulation" + connectionsim "github.com/cosmos/ibc-go/v3/modules/core/03-connection/simulation" + channelsim "github.com/cosmos/ibc-go/v3/modules/core/04-channel/simulation" + host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + "github.com/cosmos/ibc-go/v3/modules/core/keeper" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding ibc type. +func NewDecodeStore(k keeper.Keeper) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + if res, found := clientsim.NewDecodeStore(k.ClientKeeper, kvA, kvB); found { + return res + } + + if res, found := connectionsim.NewDecodeStore(k.Codec(), kvA, kvB); found { + return res + } + + if res, found := channelsim.NewDecodeStore(k.Codec(), kvA, kvB); found { + return res + } + + panic(fmt.Sprintf("invalid %s key prefix: %s", host.ModuleName, string(kvA.Key))) + } +} diff --git a/sei-ibc-go/modules/core/simulation/genesis.go b/sei-ibc-go/modules/core/simulation/genesis.go new file mode 100644 index 0000000000..e6decacb26 --- /dev/null +++ b/sei-ibc-go/modules/core/simulation/genesis.go @@ -0,0 +1,64 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/types/module" + + clientsims "github.com/cosmos/ibc-go/v3/modules/core/02-client/simulation" + clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + connectionsims "github.com/cosmos/ibc-go/v3/modules/core/03-connection/simulation" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" + channelsims "github.com/cosmos/ibc-go/v3/modules/core/04-channel/simulation" + channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + "github.com/cosmos/ibc-go/v3/modules/core/types" +) + +// Simulation parameter constants +const ( + clientGenesis = "client_genesis" + connectionGenesis = "connection_genesis" + channelGenesis = "channel_genesis" +) + +// RandomizedGenState generates a random GenesisState for evidence +func RandomizedGenState(simState *module.SimulationState) { + var ( + clientGenesisState clienttypes.GenesisState + connectionGenesisState connectiontypes.GenesisState + channelGenesisState channeltypes.GenesisState + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, clientGenesis, &clientGenesisState, simState.Rand, + func(r *rand.Rand) { clientGenesisState = clientsims.GenClientGenesis(r, simState.Accounts) }, + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, connectionGenesis, &connectionGenesisState, simState.Rand, + func(r *rand.Rand) { connectionGenesisState = connectionsims.GenConnectionGenesis(r, simState.Accounts) }, + ) + + simState.AppParams.GetOrGenerate( + simState.Cdc, channelGenesis, &channelGenesisState, simState.Rand, + func(r *rand.Rand) { channelGenesisState = channelsims.GenChannelGenesis(r, simState.Accounts) }, + ) + + ibcGenesis := types.GenesisState{ + ClientGenesis: clientGenesisState, + ConnectionGenesis: connectionGenesisState, + ChannelGenesis: channelGenesisState, + } + + bz, err := json.MarshalIndent(&ibcGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", host.ModuleName, bz) + simState.GenState[host.ModuleName] = simState.Cdc.MustMarshalJSON(&ibcGenesis) +} diff --git a/sei-ibc-go/testing/simapp/app.go b/sei-ibc-go/testing/simapp/app.go index 75cb678814..083d103d3a 100644 --- a/sei-ibc-go/testing/simapp/app.go +++ b/sei-ibc-go/testing/simapp/app.go @@ -400,7 +400,7 @@ func NewSimApp( app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.AccountKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, nil), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper), diff --git a/sei-wasmd/app/app.go b/sei-wasmd/app/app.go index 182f40fc92..1fc0b2d8e8 100644 --- a/sei-wasmd/app/app.go +++ b/sei-wasmd/app/app.go @@ -555,7 +555,7 @@ func NewWasmApp( app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.accountKeeper), + auth.NewAppModule(appCodec, app.accountKeeper, nil), vesting.NewAppModule(app.accountKeeper, app.bankKeeper), bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), capability.NewAppModule(appCodec, *app.capabilityKeeper), @@ -565,7 +565,7 @@ func NewWasmApp( distr.NewAppModule(appCodec, app.distrKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), staking.NewAppModule(appCodec, app.stakingKeeper, app.accountKeeper, app.bankKeeper), upgrade.NewAppModule(app.upgradeKeeper), - wasm.NewAppModule(appCodec, &app.wasmKeeper, app.stakingKeeper, app.accountKeeper), + wasm.NewAppModule(appCodec, &app.wasmKeeper, app.stakingKeeper, app.accountKeeper, app.bankKeeper), evidence.NewAppModule(app.evidenceKeeper), feegrantmodule.NewAppModule(appCodec, app.accountKeeper, app.bankKeeper, app.feeGrantKeeper, app.interfaceRegistry), ibc.NewAppModule(app.ibcKeeper), diff --git a/sei-wasmd/go.mod b/sei-wasmd/go.mod index 64fe939dfe..2eba550161 100644 --- a/sei-wasmd/go.mod +++ b/sei-wasmd/go.mod @@ -166,7 +166,7 @@ require ( replace ( // Use the cosmos-flavored keyring library github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 - github.com/CosmWasm/wasmvm => ../sei-wasmvm + github.com/CosmWasm/wasmvm => github.com/sei-protocol/sei-wasmvm v1.5.4-sei.0.0.2 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/cosmos/cosmos-sdk => ../sei-cosmos github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.2.0 diff --git a/sei-wasmd/x/wasm/keeper/keeper.go b/sei-wasmd/x/wasm/keeper/keeper.go index 0a5c324393..ea6cff4d42 100644 --- a/sei-wasmd/x/wasm/keeper/keeper.go +++ b/sei-wasmd/x/wasm/keeper/keeper.go @@ -1141,7 +1141,7 @@ func (k Keeper) emitCW721OwnerBeforeTransferIfApplicable(ctx sdk.Context, contra if err != nil { return } - if ctx.IsTracing() && ctx.ChainID() == "pacific-1" && strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0 { + if ctx.IsTracing() && ctx.ChainID() == "pacific-1" && strings.Compare(ctx.ClosestUpgradeName(), "v6.2.0") < 0 { ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) } resBz, err := k.QuerySmart(ctx, contractAddress, ownerQueryBz) diff --git a/sei-wasmd/x/wasm/keeper/keeper_test.go b/sei-wasmd/x/wasm/keeper/keeper_test.go index 9e4633f071..1330d99262 100644 --- a/sei-wasmd/x/wasm/keeper/keeper_test.go +++ b/sei-wasmd/x/wasm/keeper/keeper_test.go @@ -389,7 +389,7 @@ func TestInstantiate(t *testing.T) { gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x18b5d), gasAfter-gasBefore) + require.Equal(t, uint64(0x18b7c), gasAfter-gasBefore) } // ensure it is stored properly @@ -622,7 +622,7 @@ func TestExecute(t *testing.T) { // make sure gas is properly deducted from ctx gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x17c7a), gasAfter-gasBefore) + require.Equal(t, uint64(0x17ca5), gasAfter-gasBefore) } // ensure bob now exists and got both payments released bobAcct = accKeeper.GetAccount(ctx, bob) diff --git a/sei-wasmd/x/wasm/module.go b/sei-wasmd/x/wasm/module.go index e70ab444e9..352abdae1b 100644 --- a/sei-wasmd/x/wasm/module.go +++ b/sei-wasmd/x/wasm/module.go @@ -3,6 +3,7 @@ package wasm import ( "context" "encoding/json" + "math/rand" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -11,6 +12,8 @@ import ( servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + simKeeper "github.com/cosmos/cosmos-sdk/x/simulation" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cast" @@ -20,6 +23,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/client/cli" "github.com/CosmWasm/wasmd/x/wasm/client/rest" "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/CosmWasm/wasmd/x/wasm/simulation" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -30,8 +34,9 @@ var ( // Module init related flags const ( - flagWasmMemoryCacheSize = "wasm.memory_cache_size" - flagWasmQueryGasLimit = "wasm.query_gas_limit" + flagWasmMemoryCacheSize = "wasm.memory_cache_size" + flagWasmQueryGasLimit = "wasm.query_gas_limit" + flagWasmSimulationGasLimit = "wasm.simulation_gas_limit" ) // AppModuleBasic defines the basic application module used by the wasm module. @@ -125,6 +130,7 @@ type AppModule struct { keeper *Keeper validatorSetSource keeper.ValidatorSetSource accountKeeper types.AccountKeeper // for simulation + bankKeeper simKeeper.BankKeeper } // ConsensusVersion is a sequence number for state-breaking change of the @@ -139,6 +145,7 @@ func NewAppModule( keeper *Keeper, validatorSetSource keeper.ValidatorSetSource, ak types.AccountKeeper, + bk simKeeper.BankKeeper, ) AppModule { return AppModule{ AppModuleBasic: AppModuleBasic{}, @@ -146,6 +153,7 @@ func NewAppModule( keeper: keeper, validatorSetSource: validatorSetSource, accountKeeper: ak, + bankKeeper: bk, } } @@ -204,12 +212,39 @@ func (am AppModule) ExportGenesisStream(ctx sdk.Context, cdc codec.JSONCodec) <- } // ____________________________________________________________________________ +// AppModuleSimulation functions +// GenerateGenesisState creates a randomized GenState of the bank module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized bank param changes for the simulator. +func (am AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r, am.cdc) +} + +// RegisterStoreDecoder registers a decoder for supply module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { +} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations(&simState, am.accountKeeper, am.bankKeeper, am.keeper) +} + +// ____________________________________________________________________________ // AddModuleInitFlags implements servertypes.ModuleInitFlags interface. func AddModuleInitFlags(startCmd *cobra.Command) { defaults := DefaultWasmConfig() startCmd.Flags().Uint32(flagWasmMemoryCacheSize, defaults.MemoryCacheSize, "Sets the size in MiB (NOT bytes) of an in-memory cache for Wasm modules. Set to 0 to disable.") startCmd.Flags().Uint64(flagWasmQueryGasLimit, defaults.SmartQueryGasLimit, "Set the max gas that can be spent on executing a query with a Wasm contract") + startCmd.Flags().String(flagWasmSimulationGasLimit, "", "Set the max gas that can be spent when executing a simulation TX") } // ReadWasmConfig reads the wasm specifig configuration @@ -226,6 +261,15 @@ func ReadWasmConfig(opts servertypes.AppOptions) (types.WasmConfig, error) { return cfg, err } } + if v := opts.Get(flagWasmSimulationGasLimit); v != nil { + if raw, ok := v.(string); ok && raw != "" { + limit, err := cast.ToUint64E(v) // non empty string set + if err != nil { + return cfg, err + } + cfg.SimulationGasLimit = &limit + } + } // attach contract debugging to global "trace" flag if v := opts.Get(server.FlagTrace); v != nil { if cfg.ContractDebugMode, err = cast.ToBoolE(v); err != nil { diff --git a/sei-wasmd/x/wasm/module_test.go b/sei-wasmd/x/wasm/module_test.go index 19ac96de12..8501df3486 100644 --- a/sei-wasmd/x/wasm/module_test.go +++ b/sei-wasmd/x/wasm/module_test.go @@ -36,7 +36,7 @@ func setupTest(t *testing.T) testData { ctx, keepers := CreateTestInput(t, false, "iterator,staking,stargate") cdc := keeper.MakeTestCodec(t) data := testData{ - module: NewAppModule(cdc, keepers.WasmKeeper, keepers.StakingKeeper, keepers.AccountKeeper), + module: NewAppModule(cdc, keepers.WasmKeeper, keepers.StakingKeeper, keepers.AccountKeeper, keepers.BankKeeper), ctx: ctx, acctKeeper: keepers.AccountKeeper, keeper: *keepers.WasmKeeper, diff --git a/sei-wasmd/x/wasm/simulation/genesis.go b/sei-wasmd/x/wasm/simulation/genesis.go new file mode 100644 index 0000000000..c9bd60e700 --- /dev/null +++ b/sei-wasmd/x/wasm/simulation/genesis.go @@ -0,0 +1,29 @@ +package simulation + +import ( + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +// RandomizeGenState generates a random GenesisState for wasm +func RandomizedGenState(simstate *module.SimulationState) { + params := RandomParams(simstate.Rand) + wasmGenesis := types.GenesisState{ + Params: params, + Codes: nil, + Contracts: nil, + Sequences: []types.Sequence{ + {IDKey: types.KeyLastCodeID, Value: simstate.Rand.Uint64()}, + {IDKey: types.KeyLastInstanceID, Value: simstate.Rand.Uint64()}, + }, + GenMsgs: nil, + } + + _, err := simstate.Cdc.MarshalJSON(&wasmGenesis) + if err != nil { + panic(err) + } + + simstate.GenState[types.ModuleName] = simstate.Cdc.MustMarshalJSON(&wasmGenesis) +} diff --git a/sei-wasmd/x/wasm/simulation/operations.go b/sei-wasmd/x/wasm/simulation/operations.go new file mode 100644 index 0000000000..574bafb4b6 --- /dev/null +++ b/sei-wasmd/x/wasm/simulation/operations.go @@ -0,0 +1,174 @@ +package simulation + +import ( + "io/ioutil" + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" + + "github.com/CosmWasm/wasmd/app/params" + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +// Simulation operation weights constants +// +//nolint:gosec +const ( + OpWeightMsgStoreCode = "op_weight_msg_store_code" + OpWeightMsgInstantiateContract = "op_weight_msg_instantiate_contract" + OpReflectContractPath = "op_reflect_contract_path" +) + +// WasmKeeper is a subset of the wasm keeper used by simulations +type WasmKeeper interface { + GetParams(ctx sdk.Context) types.Params + IterateCodeInfos(ctx sdk.Context, cb func(uint64, types.CodeInfo) bool) +} + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + simstate *module.SimulationState, + ak types.AccountKeeper, + bk simulation.BankKeeper, + wasmKeeper WasmKeeper, +) simulation.WeightedOperations { + var ( + weightMsgStoreCode int + weightMsgInstantiateContract int + wasmContractPath string + ) + + simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgStoreCode, &weightMsgStoreCode, nil, + func(_ *rand.Rand) { + weightMsgStoreCode = params.DefaultWeightMsgStoreCode + }, + ) + + simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgInstantiateContract, &weightMsgInstantiateContract, nil, + func(_ *rand.Rand) { + weightMsgInstantiateContract = params.DefaultWeightMsgInstantiateContract + }, + ) + simstate.AppParams.GetOrGenerate(simstate.Cdc, OpReflectContractPath, &wasmContractPath, nil, + func(_ *rand.Rand) { + // simulations are run from the `app` folder + wasmContractPath = "../x/wasm/keeper/testdata/reflect.wasm" + }, + ) + + wasmBz, err := ioutil.ReadFile(wasmContractPath) + if err != nil { + panic(err) + } + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgStoreCode, + SimulateMsgStoreCode(ak, bk, wasmKeeper, wasmBz), + ), + simulation.NewWeightedOperation( + weightMsgInstantiateContract, + SimulateMsgInstantiateContract(ak, bk, wasmKeeper), + ), + } +} + +// SimulateMsgStoreCode generates a MsgStoreCode with random values +func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper, wasmBz []byte) simtypes.Operation { + return func( + r *rand.Rand, + app *baseapp.BaseApp, + ctx sdk.Context, + accs []simtypes.Account, + chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if wasmKeeper.GetParams(ctx).CodeUploadAccess.Permission != types.AccessTypeEverybody { + return simtypes.NoOpMsg(types.ModuleName, types.MsgStoreCode{}.Type(), "no chain permission"), nil, nil + } + + config := &types.AccessConfig{ + Permission: types.AccessTypeEverybody, + } + + simAccount, _ := simtypes.RandomAcc(r, accs) + msg := types.MsgStoreCode{ + Sender: simAccount.Address.String(), + WASMByteCode: wasmBz, + InstantiatePermission: config, + } + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: &msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// SimulateMsgInstantiateContract generates a MsgInstantiateContract with random values +func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper) simtypes.Operation { + return func( + r *rand.Rand, + app *baseapp.BaseApp, + ctx sdk.Context, + accs []simtypes.Account, + chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + + var codeID uint64 + wasmKeeper.IterateCodeInfos(ctx, func(u uint64, info types.CodeInfo) bool { + if info.InstantiateConfig.Permission != types.AccessTypeEverybody { + return false + } + codeID = u + return true + }) + + if codeID == 0 { + return simtypes.NoOpMsg(types.ModuleName, types.MsgInstantiateContract{}.Type(), "no codes with permission available"), nil, nil + } + + spendable := bk.SpendableCoins(ctx, simAccount.Address) + + msg := types.MsgInstantiateContract{ + Sender: simAccount.Address.String(), + Admin: simtypes.RandomAccounts(r, 1)[0].Address.String(), + CodeID: codeID, + Label: simtypes.RandStringOfLength(r, 10), + Msg: []byte(`{}`), + Funds: simtypes.RandSubsetCoins(r, spendable), + } + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: seiappparams.MakeEncodingConfig().TxConfig, + Cdc: nil, + Msg: &msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} diff --git a/sei-wasmd/x/wasm/simulation/params.go b/sei-wasmd/x/wasm/simulation/params.go new file mode 100644 index 0000000000..0de0d0b4ad --- /dev/null +++ b/sei-wasmd/x/wasm/simulation/params.go @@ -0,0 +1,42 @@ +package simulation + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/codec" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +func ParamChanges(r *rand.Rand, cdc codec.Codec) []simtypes.ParamChange { + params := RandomParams(r) + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.ParamStoreKeyUploadAccess), + func(r *rand.Rand) string { + jsonBz, err := cdc.MarshalJSON(¶ms.CodeUploadAccess) + if err != nil { + panic(err) + } + return string(jsonBz) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.ParamStoreKeyInstantiateAccess), + func(r *rand.Rand) string { + return fmt.Sprintf("%q", params.CodeUploadAccess.Permission.String()) + }, + ), + } +} + +func RandomParams(r *rand.Rand) types.Params { + permissionType := types.AccessType(simtypes.RandIntBetween(r, 1, 3)) + account, _ := simtypes.RandomAcc(r, simtypes.RandomAccounts(r, 10)) + accessConfig := permissionType.With(account.Address) + return types.Params{ + CodeUploadAccess: accessConfig, + InstantiateDefaultPermission: accessConfig.Permission, + } +} diff --git a/sei-wasmvm/internal/api/iterator_test.go b/sei-wasmvm/internal/api/iterator_test.go index de14b0f206..bd3a140e4d 100644 --- a/sei-wasmvm/internal/api/iterator_test.go +++ b/sei-wasmvm/internal/api/iterator_test.go @@ -279,7 +279,7 @@ func TestQueueIteratorLimit(t *testing.T) { require.Equal(t, `{}`, string(qres.Ok)) // Open 35000 iterators - gasLimit = TESTING_GAS_LIMIT * 7 + gasLimit = TESTING_GAS_LIMIT * 10 gasMeter = NewMockGasMeter(gasLimit) igasMeter = types.GasMeter(gasMeter) store = setup.Store(gasMeter) diff --git a/sei-wasmvm/internal/api/lib_test.go b/sei-wasmvm/internal/api/lib_test.go index c9456c1359..d5ed5efabf 100644 --- a/sei-wasmvm/internal/api/lib_test.go +++ b/sei-wasmvm/internal/api/lib_test.go @@ -363,7 +363,7 @@ func TestInstantiate(t *testing.T) { res, cost, err := Instantiate(cache, checksum, env, info, msg, &igasMeter, store, api, &querier, TESTING_GAS_LIMIT, TESTING_PRINT_DEBUG) require.NoError(t, err) requireOkResponse(t, res, 0) - assert.Equal(t, uint64(0x252528f74), cost.UsedInternally) + assert.Equal(t, uint64(0x325b7c35c), cost.UsedInternally) var result types.ContractResult err = json.Unmarshal(res, &result) @@ -394,7 +394,7 @@ func TestExecute(t *testing.T) { diff := time.Since(start) require.NoError(t, err) requireOkResponse(t, res, 0) - assert.Equal(t, uint64(0x252528f74), cost.UsedInternally) + assert.Equal(t, uint64(0x325b7c35c), cost.UsedInternally) t.Logf("Time (%d gas): %s\n", cost.UsedInternally, diff) // execute with the same store @@ -407,7 +407,7 @@ func TestExecute(t *testing.T) { res, cost, err = Execute(cache, checksum, env, info, []byte(`{"release":{}}`), &igasMeter2, store, api, &querier, TESTING_GAS_LIMIT, TESTING_PRINT_DEBUG) diff = time.Since(start) require.NoError(t, err) - assert.Equal(t, uint64(0x3ffe1e058), cost.UsedInternally) + assert.Equal(t, uint64(0x51b149450), cost.UsedInternally) t.Logf("Time (%d gas): %s\n", cost.UsedInternally, diff) // make sure it read the balance properly and we got 250 atoms @@ -515,7 +515,7 @@ func TestExecuteCpuLoop(t *testing.T) { diff := time.Since(start) require.NoError(t, err) requireOkResponse(t, res, 0) - assert.Equal(t, uint64(0x18a753768), cost.UsedInternally) + assert.Equal(t, uint64(0x1e8be2de8), cost.UsedInternally) t.Logf("Time (%d gas): %s\n", cost.UsedInternally, diff) // execute a cpu loop @@ -666,7 +666,7 @@ func TestMultipleInstances(t *testing.T) { require.NoError(t, err) requireOkResponse(t, res, 0) // we now count wasm gas charges and db writes - assert.Equal(t, uint64(0x24e474064), cost.UsedInternally) + assert.Equal(t, uint64(0x320ca1714), cost.UsedInternally) // instance2 controlled by mary gasMeter2 := NewMockGasMeter(TESTING_GAS_LIMIT) @@ -677,14 +677,14 @@ func TestMultipleInstances(t *testing.T) { res, cost, err = Instantiate(cache, checksum, env, info, msg, &igasMeter2, store2, api, &querier, TESTING_GAS_LIMIT, TESTING_PRINT_DEBUG) require.NoError(t, err) requireOkResponse(t, res, 0) - assert.Equal(t, uint64(0x250a66614), cost.UsedInternally) + assert.Equal(t, uint64(0x323a5d34c), cost.UsedInternally) // fail to execute store1 with mary - resp := exec(t, cache, checksum, "mary", store1, api, querier, 0x220d6e990) + resp := exec(t, cache, checksum, "mary", store1, api, querier, 0x2a64f3b68) require.Equal(t, "Unauthorized", resp.Err) // succeed to execute store1 with fred - resp = exec(t, cache, checksum, "fred", store1, api, querier, 0x3fe0b99b8) + resp = exec(t, cache, checksum, "fred", store1, api, querier, 0x51910ae00) require.Equal(t, "", resp.Err) require.Equal(t, 1, len(resp.Ok.Messages)) attributes := resp.Ok.Attributes @@ -693,7 +693,7 @@ func TestMultipleInstances(t *testing.T) { require.Equal(t, "bob", attributes[1].Value) // succeed to execute store2 with mary - resp = exec(t, cache, checksum, "mary", store2, api, querier, 0x3fef6bd08) + resp = exec(t, cache, checksum, "mary", store2, api, querier, 0x51a12a128) require.Equal(t, "", resp.Err) require.Equal(t, 1, len(resp.Ok.Messages)) attributes = resp.Ok.Attributes diff --git a/sei-wasmvm/internal/api/libwasmvm.aarch64.so b/sei-wasmvm/internal/api/libwasmvm.aarch64.so index 581bc8f716..fe8acbeb15 100755 Binary files a/sei-wasmvm/internal/api/libwasmvm.aarch64.so and b/sei-wasmvm/internal/api/libwasmvm.aarch64.so differ diff --git a/sei-wasmvm/internal/api/libwasmvm.dylib b/sei-wasmvm/internal/api/libwasmvm.dylib index fe69babc0c..dc310a98a6 100755 Binary files a/sei-wasmvm/internal/api/libwasmvm.dylib and b/sei-wasmvm/internal/api/libwasmvm.dylib differ diff --git a/sei-wasmvm/internal/api/libwasmvm.x86_64.so b/sei-wasmvm/internal/api/libwasmvm.x86_64.so index f3133695ed..0de5ddaa68 100755 Binary files a/sei-wasmvm/internal/api/libwasmvm.x86_64.so and b/sei-wasmvm/internal/api/libwasmvm.x86_64.so differ diff --git a/sei-wasmvm/internal/api/libwasmvm_muslc.a b/sei-wasmvm/internal/api/libwasmvm_muslc.a new file mode 100644 index 0000000000..e2bad3be15 Binary files /dev/null and b/sei-wasmvm/internal/api/libwasmvm_muslc.a differ diff --git a/sei-wasmvm/internal/api/libwasmvm_muslc.aarch64.a b/sei-wasmvm/internal/api/libwasmvm_muslc.aarch64.a new file mode 100644 index 0000000000..2bafc1c92b Binary files /dev/null and b/sei-wasmvm/internal/api/libwasmvm_muslc.aarch64.a differ diff --git a/sei-wasmvm/libwasmvm/Cargo.lock b/sei-wasmvm/libwasmvm/Cargo.lock index 0782413165..0bfcd89f6b 100644 --- a/sei-wasmvm/libwasmvm/Cargo.lock +++ b/sei-wasmvm/libwasmvm/Cargo.lock @@ -254,8 +254,8 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.7" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v1.5.7#3d91925ee82c9d40c1368015fde436836089469e" +version = "1.5.12" +source = "git+https://github.com/sei-protocol/cosmwasm.git?rev=v1.5.12#876555b37e48a66857df3fc23faa801ef73e176e" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -266,16 +266,16 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.7" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v1.5.7#3d91925ee82c9d40c1368015fde436836089469e" +version = "1.5.12" +source = "git+https://github.com/sei-protocol/cosmwasm.git?rev=v1.5.12#876555b37e48a66857df3fc23faa801ef73e176e" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-std" -version = "1.5.7" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v1.5.7#3d91925ee82c9d40c1368015fde436836089469e" +version = "1.5.12" +source = "git+https://github.com/sei-protocol/cosmwasm.git?rev=v1.5.12#876555b37e48a66857df3fc23faa801ef73e176e" dependencies = [ "base64", "bech32", @@ -295,8 +295,8 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.7" -source = "git+https://github.com/CosmWasm/cosmwasm.git?rev=v1.5.7#3d91925ee82c9d40c1368015fde436836089469e" +version = "1.5.12" +source = "git+https://github.com/sei-protocol/cosmwasm.git?rev=v1.5.12#876555b37e48a66857df3fc23faa801ef73e176e" dependencies = [ "bitflags", "bytecheck", @@ -315,6 +315,7 @@ dependencies = [ "thiserror", "wasmer", "wasmer-middlewares", + "wasmer-types", ] [[package]] diff --git a/sei-wasmvm/libwasmvm/Cargo.toml b/sei-wasmvm/libwasmvm/Cargo.toml index d057c1ef67..855f443f3f 100644 --- a/sei-wasmvm/libwasmvm/Cargo.toml +++ b/sei-wasmvm/libwasmvm/Cargo.toml @@ -26,12 +26,12 @@ default = [] backtraces = [] [dependencies] -cosmwasm-std = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v1.5.7", features = [ +cosmwasm-std = { git = "https://github.com/sei-protocol/cosmwasm.git", rev = "v1.5.12", features = [ "staking", "stargate", "iterator", ] } -cosmwasm-vm = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v1.5.7", features = [ +cosmwasm-vm = { git = "https://github.com/sei-protocol/cosmwasm.git", rev = "v1.5.12", features = [ "staking", "stargate", "iterator", diff --git a/x/epoch/module_simulation.go b/x/epoch/module_simulation.go new file mode 100644 index 0000000000..f6ecbc5310 --- /dev/null +++ b/x/epoch/module_simulation.go @@ -0,0 +1,62 @@ +package epoch + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" + "github.com/sei-protocol/sei-chain/testutil/sample" + epochsimulation "github.com/sei-protocol/sei-chain/x/epoch/simulation" + "github.com/sei-protocol/sei-chain/x/epoch/types" +) + +// avoid unused import issue +var ( + _ = sample.AccAddress + _ = epochsimulation.FindAccount + _ = seiappparams.StakePerAccount + _ = simulation.MsgEntryKind + _ = baseapp.Paramspace +) + +const ( +// this line is used by starport scaffolding # simapp/module/const +) + +// GenerateGenesisState creates a randomized GenState of the module +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + accs := make([]string, len(simState.Accounts)) + for i, acc := range simState.Accounts { + accs[i] = acc.Address.String() + } + epochGenesis := types.GenesisState{ + // this line is used by starport scaffolding # simapp/module/genesisState + } + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&epochGenesis) +} + +// ProposalContents doesn't return any content functions for governance proposals +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized param changes for the simulator +func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{} +} + +// RegisterStoreDecoder registers a decoder +func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} + +// WeightedOperations returns the all the gov module operations with their respective weights. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + operations := make([]simtypes.WeightedOperation, 0) + + // this line is used by starport scaffolding # simapp/module/operation + + return operations +} diff --git a/x/evm/keeper/evm.go b/x/evm/keeper/evm.go index 89a0fa9afc..d385804012 100644 --- a/x/evm/keeper/evm.go +++ b/x/evm/keeper/evm.go @@ -183,7 +183,7 @@ func (k *Keeper) createReadOnlyEVM(ctx sdk.Context, from sdk.AccAddress) (*vm.EV if err != nil { return nil, err } - sstore := k.GetParams(ctx).SeiSstoreSetGasEip2200 + sstore := k.GetSstoreSetGasEIP2200(ctx) cfg := types.DefaultChainConfig().EthereumConfigWithSstore(k.ChainID(ctx), &sstore) txCtx := vm.TxContext{Origin: k.GetEVMAddressOrDefault(ctx, from)} evm := vm.NewEVM(*blockCtx, stateDB, cfg, vm.Config{}, k.CustomPrecompiles(ctx)) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 4dcd6695f2..b204fa04df 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -242,7 +242,7 @@ func (k Keeper) applyEVMMessage(ctx sdk.Context, msg *core.Message, stateDB *sta if err != nil { return nil, err } - sstore := k.GetParams(ctx).SeiSstoreSetGasEip2200 + sstore := k.GetSstoreSetGasEIP2200(ctx) cfg := types.DefaultChainConfig().EthereumConfigWithSstore(k.ChainID(ctx), &sstore) txCtx := core.NewEVMTxContext(msg) evmInstance := vm.NewEVM(*blockCtx, stateDB, cfg, vm.Config{}, k.CustomPrecompiles(ctx)) diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index d623a72c1e..ad8b7e8b39 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -36,6 +36,10 @@ func (k *Keeper) GetParamsPreV606(ctx sdk.Context) (params types.ParamsPreV606) return k.GetParamsPreV606IfExists(ctx) } +func (k *Keeper) GetParamsPreV630(ctx sdk.Context) (params types.ParamsPreV630) { + return k.GetParamsPreV630IfExists(ctx) +} + func (k *Keeper) GetParamsIfExists(ctx sdk.Context) types.Params { params := types.Params{} k.Paramstore.GetParamSetIfExists(ctx, ¶ms) @@ -66,6 +70,12 @@ func (k *Keeper) GetParamsPreV606IfExists(ctx sdk.Context) types.ParamsPreV606 { return params } +func (k *Keeper) GetParamsPreV630IfExists(ctx sdk.Context) types.ParamsPreV630 { + params := types.ParamsPreV630{} + k.Paramstore.GetParamSetIfExists(ctx, ¶ms) + return params +} + func (k *Keeper) GetBaseDenom(ctx sdk.Context) string { return BaseDenom } @@ -83,6 +93,8 @@ func (k *Keeper) GetPriorityNormalizer(ctx sdk.Context) sdk.Dec { return k.GetParamsPreV601(ctx).PriorityNormalizer case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).PriorityNormalizer + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).PriorityNormalizer default: return k.GetParams(ctx).PriorityNormalizer } @@ -101,6 +113,8 @@ func (k *Keeper) GetBaseFeePerGas(ctx sdk.Context) sdk.Dec { return k.GetParamsPreV601(ctx).BaseFeePerGas case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).BaseFeePerGas + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).BaseFeePerGas default: return k.GetParams(ctx).BaseFeePerGas } @@ -118,6 +132,8 @@ func (k *Keeper) GetMaxDynamicBaseFeeUpwardAdjustment(ctx sdk.Context) sdk.Dec { return k.GetParamsPreV601(ctx).MaxDynamicBaseFeeUpwardAdjustment case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).MaxDynamicBaseFeeUpwardAdjustment + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).MaxDynamicBaseFeeUpwardAdjustment default: return k.GetParams(ctx).MaxDynamicBaseFeeUpwardAdjustment } @@ -135,6 +151,8 @@ func (k *Keeper) GetMaxDynamicBaseFeeDownwardAdjustment(ctx sdk.Context) sdk.Dec return k.GetParamsPreV601(ctx).MaxDynamicBaseFeeDownwardAdjustment case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).MaxDynamicBaseFeeDownwardAdjustment + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).MaxDynamicBaseFeeDownwardAdjustment default: return k.GetParams(ctx).MaxDynamicBaseFeeDownwardAdjustment } @@ -153,6 +171,8 @@ func (k *Keeper) GetMinimumFeePerGas(ctx sdk.Context) sdk.Dec { return k.GetParamsPreV601(ctx).MinimumFeePerGas case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).MinimumFeePerGas + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).MinimumFeePerGas default: return k.GetParams(ctx).MinimumFeePerGas } @@ -168,6 +188,8 @@ func (k *Keeper) GetMaximumFeePerGas(ctx sdk.Context) sdk.Dec { return types.DefaultMaxFeePerGas case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).MaximumFeePerGas + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).MaximumFeePerGas default: return k.GetParams(ctx).MaximumFeePerGas } @@ -185,6 +207,8 @@ func (k *Keeper) GetTargetGasUsedPerBlock(ctx sdk.Context) uint64 { return k.GetParamsPreV601(ctx).TargetGasUsedPerBlock case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).TargetGasUsedPerBlock + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).TargetGasUsedPerBlock default: return k.GetParams(ctx).TargetGasUsedPerBlock } @@ -204,6 +228,8 @@ func (k *Keeper) GetDeliverTxHookWasmGasLimit(ctx sdk.Context) uint64 { return k.GetParamsPreV601(ctx).DeliverTxHookWasmGasLimit case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: return k.GetParamsPreV606(ctx).DeliverTxHookWasmGasLimit + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).DeliverTxHookWasmGasLimit default: return k.GetParams(ctx).DeliverTxHookWasmGasLimit } @@ -217,6 +243,8 @@ func (k *Keeper) GetRegisterPointerDisabled(ctx sdk.Context) bool { case strings.Compare(ctx.ClosestUpgradeName(), "v6.0.6") < 0: // Not present in pre-5.8.0 params; use default return types.DefaultRegisterPointerDisabled + case strings.Compare(ctx.ClosestUpgradeName(), "v6.3.0") < 0: + return k.GetParamsPreV630(ctx).RegisterPointerDisabled default: return k.GetParams(ctx).RegisterPointerDisabled } @@ -249,3 +277,19 @@ func (k *Keeper) GetCosmosGasLimitFromEVMGas(ctx sdk.Context, evmGas uint64) uin } return gasLimitBigInt.Uint64() } + +// LegacySstoreSetGasEIP2200 is the original hardcoded SSTORE gas cost used before +// the SSTORE parameterization was introduced (pre-v6.3.0). For blocks created before +// the SeiSstoreSetGasEIP2200 param existed, we fall back to this value. +const LegacySstoreSetGasEIP2200 = uint64(20000) + +// GetSstoreSetGasEIP2200 returns the SSTORE gas cost for the given context. +// If the param is not set (0), it falls back to the legacy hardcoded value of 20000. +// This ensures consistent gas accounting for blocks created before the param existed. +func (k *Keeper) GetSstoreSetGasEIP2200(ctx sdk.Context) uint64 { + sstore := k.GetParams(ctx).SeiSstoreSetGasEip2200 + if sstore == 0 { + return LegacySstoreSetGasEIP2200 + } + return sstore +} diff --git a/x/evm/keeper/pointer_upgrade.go b/x/evm/keeper/pointer_upgrade.go index 1055172762..ac97e7995d 100644 --- a/x/evm/keeper/pointer_upgrade.go +++ b/x/evm/keeper/pointer_upgrade.go @@ -25,7 +25,7 @@ func (k *Keeper) RunWithOneOffEVMInstance( logger("get block context", err.Error()) return err } - sstore := k.GetParams(ctx).SeiSstoreSetGasEip2200 + sstore := k.GetSstoreSetGasEIP2200(ctx) cfg := types.DefaultChainConfig().EthereumConfigWithSstore(k.ChainID(ctx), &sstore) txCtx := core.NewEVMTxContext(&core.Message{From: evmModuleAddress, GasPrice: utils.Big0}) evmInstance := vm.NewEVM(*blockCtx, stateDB, cfg, vm.Config{}, k.CustomPrecompiles(ctx)) diff --git a/x/evm/state/sstore_refund_test.go b/x/evm/state/sstore_refund_test.go new file mode 100644 index 0000000000..e6465d894d --- /dev/null +++ b/x/evm/state/sstore_refund_test.go @@ -0,0 +1,44 @@ +package state_test + +import ( + "testing" + + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/core/vm/program" + "github.com/ethereum/go-ethereum/core/vm/runtime" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" +) + +func TestSstoreRefundResetToOriginalInexistentSlot(t *testing.T) { + code := program.New(). + Push(1).Push(0).Op(vm.SSTORE). // 0 -> 1 + Push(0).Push(0).Op(vm.SSTORE). // 1 -> 0 (reset to original) + Op(vm.STOP). + Bytes() + + t.Run("default-sstore-gas", func(t *testing.T) { + cfg := &runtime.Config{ + ChainConfig: params.AllEthashProtocolChanges, + GasLimit: 10_000_000, + } + _, statedb, err := runtime.Execute(code, nil, cfg) + require.NoError(t, err) + want := params.SstoreSetGasEIP2200 - params.WarmStorageReadCostEIP2929 + require.Equal(t, want, statedb.GetRefund()) + }) + + t.Run("custom-sstore-gas", func(t *testing.T) { + custom := uint64(72000) + chainCfg := *params.AllEthashProtocolChanges + chainCfg.SeiSstoreSetGasEIP2200 = &custom + cfg := &runtime.Config{ + ChainConfig: &chainCfg, + GasLimit: 10_000_000, + } + _, statedb, err := runtime.Execute(code, nil, cfg) + require.NoError(t, err) + want := custom - params.WarmStorageReadCostEIP2929 + require.Equal(t, want, statedb.GetRefund()) + }) +} diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 4ddb260a53..cded377514 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -126,6 +126,21 @@ func (ppre606 *ParamsPreV606) ParamSetPairs() paramtypes.ParamSetPairs { } } +func (ppre630 *ParamsPreV630) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(KeyPriorityNormalizer, &ppre630.PriorityNormalizer, validatePriorityNormalizer), + paramtypes.NewParamSetPair(KeyBaseFeePerGas, &ppre630.BaseFeePerGas, validateBaseFeePerGas), + paramtypes.NewParamSetPair(KeyMaxDynamicBaseFeeUpwardAdjustment, &ppre630.MaxDynamicBaseFeeUpwardAdjustment, validateBaseFeeAdjustment), + paramtypes.NewParamSetPair(KeyMaxDynamicBaseFeeDownwardAdjustment, &ppre630.MaxDynamicBaseFeeDownwardAdjustment, validateBaseFeeAdjustment), + paramtypes.NewParamSetPair(KeyMinFeePerGas, &ppre630.MinimumFeePerGas, validateMinFeePerGas), + paramtypes.NewParamSetPair(KeyWhitelistedCwCodeHashesForDelegateCall, &ppre630.WhitelistedCwCodeHashesForDelegateCall, validateWhitelistedCwHashesForDelegateCall), + paramtypes.NewParamSetPair(KeyDeliverTxHookWasmGasLimit, &ppre630.DeliverTxHookWasmGasLimit, validateDeliverTxHookWasmGasLimit), + paramtypes.NewParamSetPair(KeyTargetGasUsedPerBlock, &ppre630.TargetGasUsedPerBlock, func(i interface{}) error { return nil }), + paramtypes.NewParamSetPair(KeyMaxFeePerGas, &ppre630.MaximumFeePerGas, validateMaxFeePerGas), + paramtypes.NewParamSetPair(KeyRegisterPointerDisabled, &ppre630.RegisterPointerDisabled, validateRegisterPointerDisabled), + } +} + func (p Params) Validate() error { if err := validatePriorityNormalizer(p.PriorityNormalizer); err != nil { return err @@ -199,6 +214,11 @@ func (ppre606 ParamsPreV606) String() string { return string(out) } +func (ppre630 ParamsPreV630) String() string { + out, _ := yaml.Marshal(ppre630) + return string(out) +} + func validatePriorityNormalizer(i interface{}) error { v, ok := i.(sdk.Dec) if !ok { diff --git a/x/evm/types/params.pb.go b/x/evm/types/params.pb.go index bde24bab80..2946730dff 100644 --- a/x/evm/types/params.pb.go +++ b/x/evm/types/params.pb.go @@ -434,70 +434,167 @@ func (m *ParamsPreV606) GetTargetGasUsedPerBlock() uint64 { return 0 } +type ParamsPreV630 struct { + // string base_denom = 1 [ + // + // (gogoproto.moretags) = "yaml:\"base_denom\"", + // (gogoproto.jsontag) = "base_denom" + // + // ]; + PriorityNormalizer github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=priority_normalizer,json=priorityNormalizer,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"priority_normalizer" yaml:"priority_normalizer"` + BaseFeePerGas github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=base_fee_per_gas,json=baseFeePerGas,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"base_fee_per_gas" yaml:"base_fee_per_gas"` + MinimumFeePerGas github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=minimum_fee_per_gas,json=minimumFeePerGas,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"minimum_fee_per_gas" yaml:"minimum_fee_per_gas"` + // ChainConfig chain_config = 5 [(gogoproto.moretags) = "yaml:\"chain_config\"", (gogoproto.nullable) = false]; + // + // string chain_id = 6 [ + // (gogoproto.moretags) = "yaml:\"chain_id\"", + // (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + // (gogoproto.nullable) = false, + // (gogoproto.jsontag) = "chain_id" + // + // ]; + // repeated string whitelisted_codehashes_bank_send = 7 [ + // + // (gogoproto.moretags) = "yaml:\"whitelisted_codehashes_bank_send\"", + // (gogoproto.jsontag) = "whitelisted_codehashes_bank_send" + // + // ]; + WhitelistedCwCodeHashesForDelegateCall [][]byte `protobuf:"bytes,8,rep,name=whitelisted_cw_code_hashes_for_delegate_call,json=whitelistedCwCodeHashesForDelegateCall,proto3" json:"whitelisted_cw_code_hashes_for_delegate_call" yaml:"whitelisted_cw_code_hashes_for_delegate_call"` + DeliverTxHookWasmGasLimit uint64 `protobuf:"varint,9,opt,name=deliver_tx_hook_wasm_gas_limit,json=deliverTxHookWasmGasLimit,proto3" json:"deliver_tx_hook_wasm_gas_limit,omitempty"` + MaxDynamicBaseFeeUpwardAdjustment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=max_dynamic_base_fee_upward_adjustment,json=maxDynamicBaseFeeUpwardAdjustment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_dynamic_base_fee_upward_adjustment" yaml:"max_dynamic_base_fee_upward_adjustment"` + MaxDynamicBaseFeeDownwardAdjustment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,11,opt,name=max_dynamic_base_fee_downward_adjustment,json=maxDynamicBaseFeeDownwardAdjustment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_dynamic_base_fee_downward_adjustment" yaml:"max_dynamic_base_fee_downward_adjustment"` + TargetGasUsedPerBlock uint64 `protobuf:"varint,12,opt,name=target_gas_used_per_block,json=targetGasUsedPerBlock,proto3" json:"target_gas_used_per_block,omitempty"` + MaximumFeePerGas github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,13,opt,name=maximum_fee_per_gas,json=maximumFeePerGas,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"maximum_fee_per_gas" yaml:"maximum_fee_per_gas"` + RegisterPointerDisabled bool `protobuf:"varint,14,opt,name=register_pointer_disabled,json=registerPointerDisabled,proto3" json:"register_pointer_disabled" yaml:"register_pointer_disabled"` +} + +func (m *ParamsPreV630) Reset() { *m = ParamsPreV630{} } +func (*ParamsPreV630) ProtoMessage() {} +func (*ParamsPreV630) Descriptor() ([]byte, []int) { + return fileDescriptor_9272f3679901ea94, []int{5} +} +func (m *ParamsPreV630) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ParamsPreV630) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ParamsPreV630.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ParamsPreV630) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParamsPreV630.Merge(m, src) +} +func (m *ParamsPreV630) XXX_Size() int { + return m.Size() +} +func (m *ParamsPreV630) XXX_DiscardUnknown() { + xxx_messageInfo_ParamsPreV630.DiscardUnknown(m) +} + +var xxx_messageInfo_ParamsPreV630 proto.InternalMessageInfo + +func (m *ParamsPreV630) GetWhitelistedCwCodeHashesForDelegateCall() [][]byte { + if m != nil { + return m.WhitelistedCwCodeHashesForDelegateCall + } + return nil +} + +func (m *ParamsPreV630) GetDeliverTxHookWasmGasLimit() uint64 { + if m != nil { + return m.DeliverTxHookWasmGasLimit + } + return 0 +} + +func (m *ParamsPreV630) GetTargetGasUsedPerBlock() uint64 { + if m != nil { + return m.TargetGasUsedPerBlock + } + return 0 +} + +func (m *ParamsPreV630) GetRegisterPointerDisabled() bool { + if m != nil { + return m.RegisterPointerDisabled + } + return false +} + func init() { proto.RegisterType((*Params)(nil), "seiprotocol.seichain.evm.Params") proto.RegisterType((*ParamsPreV580)(nil), "seiprotocol.seichain.evm.ParamsPreV580") proto.RegisterType((*ParamsPreV600)(nil), "seiprotocol.seichain.evm.ParamsPreV600") proto.RegisterType((*ParamsPreV601)(nil), "seiprotocol.seichain.evm.ParamsPreV601") proto.RegisterType((*ParamsPreV606)(nil), "seiprotocol.seichain.evm.ParamsPreV606") + proto.RegisterType((*ParamsPreV630)(nil), "seiprotocol.seichain.evm.ParamsPreV630") } func init() { proto.RegisterFile("evm/params.proto", fileDescriptor_9272f3679901ea94) } var fileDescriptor_9272f3679901ea94 = []byte{ - // 819 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x6b, 0x2b, 0x45, - 0x1c, 0xcf, 0xfa, 0xfa, 0x1e, 0xaf, 0x6b, 0xab, 0x65, 0x9f, 0xfa, 0xb6, 0x3d, 0x64, 0xe3, 0x0a, - 0x25, 0x07, 0xf3, 0xc3, 0x16, 0x4b, 0xe9, 0xad, 0x69, 0x6c, 0x7a, 0x10, 0x09, 0x5b, 0xab, 0x20, - 0xc8, 0x30, 0xd9, 0xfd, 0x76, 0x33, 0x66, 0x27, 0xb3, 0xcc, 0x6c, 0x7e, 0x09, 0x5e, 0x05, 0x0f, - 0x82, 0x14, 0x0f, 0x1e, 0xfb, 0xcf, 0x08, 0x3d, 0xf6, 0x22, 0x8a, 0xe0, 0x22, 0x2d, 0x5e, 0x8a, - 0xa7, 0xfc, 0x05, 0xb2, 0xb3, 0xdb, 0x36, 0x69, 0x52, 0xdb, 0x14, 0x41, 0xfa, 0xd8, 0x53, 0x36, - 0xf3, 0xf9, 0xcc, 0x77, 0xbe, 0xbf, 0xbf, 0xc3, 0xa8, 0x4b, 0xd0, 0xa5, 0x25, 0x1f, 0x73, 0x4c, - 0x45, 0xd1, 0xe7, 0x2c, 0x60, 0x9a, 0x2e, 0x80, 0xc8, 0x2f, 0x9b, 0x79, 0x45, 0x01, 0xc4, 0x6e, - 0x62, 0xd2, 0x2e, 0x42, 0x97, 0xae, 0xbc, 0xe5, 0x32, 0x97, 0x49, 0xa8, 0x14, 0x7d, 0xc5, 0x7c, - 0xf3, 0x78, 0x41, 0x7d, 0x56, 0x97, 0x02, 0xb4, 0x1f, 0x15, 0xf5, 0x85, 0xcf, 0x09, 0xe3, 0x24, - 0x18, 0xa0, 0x36, 0xe3, 0x14, 0x7b, 0xe4, 0x6b, 0xe0, 0xfa, 0x6b, 0x39, 0x25, 0x3f, 0x5f, 0xb1, - 0x4f, 0x42, 0x23, 0xf3, 0x7b, 0x68, 0xac, 0xba, 0x24, 0x68, 0x76, 0x1a, 0x45, 0x9b, 0xd1, 0x92, - 0xcd, 0x04, 0x65, 0x22, 0xf9, 0x29, 0x08, 0xa7, 0x55, 0x0a, 0x06, 0x3e, 0x88, 0x62, 0x15, 0xec, - 0x8b, 0xd0, 0x98, 0x26, 0x6c, 0x18, 0x1a, 0x2b, 0x03, 0x4c, 0xbd, 0x2d, 0x73, 0x0a, 0x68, 0x5a, - 0xda, 0xe5, 0xea, 0x27, 0x57, 0x8b, 0xda, 0xb7, 0x8a, 0xba, 0xd4, 0xc0, 0x02, 0xd0, 0x21, 0x00, - 0xf2, 0x81, 0x23, 0x17, 0x0b, 0xfd, 0x89, 0xd4, 0xe9, 0xcb, 0x99, 0x75, 0x9a, 0x90, 0x34, 0x0c, - 0x8d, 0x97, 0xb1, 0x42, 0x37, 0x11, 0xd3, 0x5a, 0x8c, 0x96, 0x76, 0x01, 0xea, 0xc0, 0x6b, 0x58, - 0x68, 0x47, 0x8a, 0xfa, 0x82, 0x92, 0x36, 0xa1, 0x1d, 0x3a, 0xa6, 0xcb, 0xdc, 0x43, 0xfd, 0x33, - 0x45, 0xd8, 0xb5, 0x7f, 0xa6, 0x80, 0xa6, 0xb5, 0x94, 0xac, 0x5e, 0x2b, 0xf5, 0xb3, 0xa2, 0xbe, - 0xdf, 0x6b, 0x92, 0x00, 0x3c, 0x22, 0x02, 0x70, 0x90, 0xdd, 0x43, 0x36, 0x73, 0x00, 0x35, 0xb1, - 0x68, 0x82, 0x40, 0x87, 0x8c, 0x23, 0x07, 0x3c, 0x70, 0x71, 0x00, 0xc8, 0xc6, 0x9e, 0xa7, 0x3f, - 0xcf, 0x3d, 0xc9, 0x2f, 0x54, 0xdc, 0x8b, 0xd0, 0x98, 0x69, 0xdf, 0x30, 0x34, 0xd6, 0x63, 0xc5, - 0x66, 0xd9, 0x65, 0x5a, 0xab, 0x23, 0xf4, 0x9d, 0xde, 0x0e, 0x73, 0x60, 0x4f, 0x72, 0x77, 0x19, - 0xaf, 0x26, 0xcc, 0x1d, 0xec, 0x79, 0xda, 0xb6, 0x9a, 0x75, 0xc0, 0x23, 0x5d, 0xe0, 0x28, 0xe8, - 0xa3, 0x26, 0x63, 0x2d, 0xd4, 0xc3, 0x82, 0x46, 0x66, 0x23, 0x8f, 0x50, 0x12, 0xe8, 0xf3, 0x39, - 0x25, 0x3f, 0x67, 0x2d, 0x27, 0xac, 0x4f, 0xfb, 0x7b, 0x8c, 0xb5, 0x3e, 0xc7, 0x82, 0xd6, 0xb0, - 0xf8, 0x38, 0x22, 0x68, 0x7f, 0x28, 0xea, 0x2a, 0xc5, 0x7d, 0xe4, 0x0c, 0xda, 0x98, 0x12, 0x1b, - 0x5d, 0x05, 0xb4, 0xe3, 0xf7, 0x30, 0x77, 0x10, 0x76, 0xbe, 0xea, 0x88, 0x80, 0x42, 0x3b, 0xd0, - 0x55, 0x19, 0xb2, 0xef, 0x94, 0x99, 0x63, 0x76, 0xcf, 0x03, 0x86, 0xa1, 0x51, 0x48, 0xc2, 0x78, - 0x2f, 0xbe, 0x69, 0xbd, 0x4b, 0x71, 0xbf, 0x1a, 0xf3, 0x2a, 0x71, 0xd6, 0x1d, 0x48, 0xd2, 0xf6, - 0x15, 0x47, 0xfb, 0x4b, 0x51, 0xf3, 0x53, 0xc5, 0x39, 0xac, 0xd7, 0xbe, 0x69, 0xe1, 0xeb, 0xd2, - 0xc2, 0xef, 0x67, 0xb7, 0xf0, 0xde, 0x47, 0x0c, 0x43, 0xa3, 0xf4, 0x2f, 0x36, 0x4e, 0xd9, 0x61, - 0x5a, 0xef, 0x4d, 0x58, 0x59, 0x4d, 0x68, 0x23, 0x76, 0x6e, 0xaa, 0xcb, 0x01, 0xe6, 0x2e, 0x04, - 0x32, 0xf8, 0x1d, 0x01, 0x8e, 0x2c, 0x80, 0x86, 0xc7, 0xec, 0x96, 0xbe, 0x20, 0xb3, 0xe0, 0xed, - 0x98, 0x50, 0xc3, 0xe2, 0x40, 0x80, 0x53, 0x07, 0x5e, 0x89, 0xc0, 0xb8, 0x42, 0x71, 0x7f, 0xa2, - 0x42, 0x17, 0x1f, 0x5c, 0xa1, 0x93, 0xc2, 0x46, 0x2a, 0x74, 0x12, 0x8c, 0x2a, 0x34, 0x5e, 0xbd, - 0xae, 0xd0, 0x6f, 0xd4, 0x65, 0x0e, 0x6e, 0x54, 0x00, 0x1c, 0xf9, 0x8c, 0xb4, 0xa3, 0x5f, 0x87, - 0x08, 0xdc, 0xf0, 0xc0, 0xd1, 0xdf, 0xc8, 0x29, 0xf9, 0xe7, 0x95, 0xed, 0x8b, 0xd0, 0xb8, 0x9d, - 0x34, 0x0c, 0x8d, 0x5c, 0x7c, 0xe2, 0xad, 0x14, 0xd3, 0x7a, 0x79, 0x89, 0xd5, 0x63, 0xa8, 0x9a, - 0x20, 0xda, 0x96, 0xba, 0x22, 0x80, 0x20, 0x21, 0x02, 0xc6, 0x01, 0x89, 0xc4, 0xab, 0x40, 0xfc, - 0xb5, 0xb5, 0x72, 0x59, 0x7f, 0x53, 0xba, 0xf3, 0x1d, 0x01, 0x64, 0x5f, 0x12, 0xf6, 0xa5, 0x53, - 0x3f, 0x8a, 0xd1, 0xad, 0xb9, 0x9f, 0x8e, 0x8d, 0x8c, 0x79, 0xf4, 0x54, 0x5d, 0x8c, 0x47, 0x44, - 0x9d, 0xc3, 0x67, 0x1f, 0x6e, 0x96, 0xd3, 0x49, 0x91, 0x4e, 0x8a, 0xff, 0x6d, 0x52, 0x24, 0x49, - 0xf9, 0xcb, 0x58, 0x52, 0x6e, 0x94, 0xd3, 0xa4, 0x7c, 0x94, 0x49, 0x79, 0xf7, 0xd8, 0x7f, 0x7a, - 0xd7, 0xd8, 0x7f, 0xb5, 0xf2, 0xfa, 0xd7, 0xf9, 0xf1, 0xbc, 0xfe, 0x20, 0xcd, 0xeb, 0xb4, 0xd9, - 0xa6, 0xd7, 0xf2, 0xf4, 0x5a, 0xfe, 0x78, 0xaf, 0xe5, 0x49, 0x67, 0xfb, 0x5b, 0x1d, 0xef, 0x6c, - 0x1b, 0x69, 0x67, 0x4b, 0x3b, 0x5b, 0xda, 0xd9, 0xd2, 0xce, 0x96, 0x3e, 0x38, 0xfc, 0xa7, 0x0f, - 0x0e, 0x71, 0xbb, 0xad, 0xd4, 0x4e, 0xce, 0xb2, 0xca, 0xe9, 0x59, 0x56, 0xf9, 0xf3, 0x2c, 0xab, - 0xfc, 0x70, 0x9e, 0xcd, 0x9c, 0x9e, 0x67, 0x33, 0xbf, 0x9d, 0x67, 0x33, 0x5f, 0x14, 0x46, 0xd4, - 0x11, 0x40, 0x0a, 0x97, 0xcf, 0xc5, 0xf2, 0x8f, 0x7c, 0x2f, 0x2e, 0xf5, 0x4b, 0xd0, 0xa5, 0xb1, - 0x66, 0x8d, 0x67, 0x12, 0x5f, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x74, 0x7c, 0x47, 0x6c, - 0x16, 0x00, 0x00, + // 850 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0xd9, 0xee, 0x6a, 0xeb, 0x6d, 0xa1, 0xf2, 0x02, 0xeb, 0xf6, 0x10, 0x07, 0x23, 0x55, + 0x39, 0x90, 0x3f, 0x6c, 0xc5, 0x6a, 0xd5, 0x5b, 0xd3, 0xb0, 0xd9, 0x03, 0x42, 0x91, 0x97, 0x05, + 0x09, 0x09, 0x8d, 0x26, 0xf6, 0x5b, 0x67, 0x88, 0x27, 0x63, 0xcd, 0x38, 0xff, 0x90, 0xb8, 0x22, + 0x71, 0x40, 0x42, 0x2b, 0x0e, 0x1c, 0xf7, 0xcb, 0x20, 0xf5, 0xd8, 0x0b, 0x02, 0x21, 0x61, 0xa1, + 0x56, 0x5c, 0x0a, 0xa7, 0x7c, 0x02, 0xe4, 0xb1, 0xdb, 0x26, 0x4d, 0x4a, 0x9b, 0x0a, 0x09, 0xb5, + 0x9a, 0x93, 0x9d, 0x79, 0xbf, 0x79, 0xf3, 0xde, 0x9b, 0xf7, 0x7e, 0x6f, 0x32, 0xd6, 0xd7, 0xa0, + 0x4f, 0x2b, 0x21, 0xe6, 0x98, 0x8a, 0x72, 0xc8, 0x59, 0xc4, 0x0c, 0x53, 0x00, 0x91, 0x6f, 0x2e, + 0x0b, 0xca, 0x02, 0x88, 0xdb, 0xc6, 0xa4, 0x5b, 0x86, 0x3e, 0xdd, 0x78, 0xd3, 0x67, 0x3e, 0x93, + 0xa2, 0x4a, 0xf2, 0x96, 0xe2, 0xed, 0x57, 0x2b, 0xfa, 0x9d, 0xa6, 0x54, 0x60, 0xfc, 0xa0, 0xe9, + 0xf7, 0x43, 0x4e, 0x18, 0x27, 0xd1, 0x08, 0x75, 0x19, 0xa7, 0x38, 0x20, 0x5f, 0x01, 0x37, 0x5f, + 0x2b, 0x68, 0xc5, 0xe5, 0x9a, 0xbb, 0x17, 0x5b, 0xb9, 0xdf, 0x62, 0x6b, 0xd3, 0x27, 0x51, 0xbb, + 0xd7, 0x2a, 0xbb, 0x8c, 0x56, 0x5c, 0x26, 0x28, 0x13, 0xd9, 0xa3, 0x24, 0xbc, 0x4e, 0x25, 0x1a, + 0x85, 0x20, 0xca, 0x75, 0x70, 0x8f, 0x62, 0x6b, 0x9e, 0xb2, 0x71, 0x6c, 0x6d, 0x8c, 0x30, 0x0d, + 0xb6, 0xed, 0x39, 0x42, 0xdb, 0x31, 0x8e, 0x47, 0x3f, 0x3e, 0x19, 0x34, 0xbe, 0xd1, 0xf4, 0xb5, + 0x16, 0x16, 0x80, 0x5e, 0x00, 0xa0, 0x10, 0x38, 0xf2, 0xb1, 0x30, 0x6f, 0x49, 0x9b, 0xbe, 0x58, + 0xd8, 0xa6, 0x19, 0x4d, 0xe3, 0xd8, 0x7a, 0x90, 0x1a, 0x74, 0x56, 0x62, 0x3b, 0xab, 0xc9, 0xd0, + 0x13, 0x80, 0x26, 0xf0, 0x06, 0x16, 0xc6, 0x4b, 0x4d, 0xbf, 0x4f, 0x49, 0x97, 0xd0, 0x1e, 0x9d, + 0xb2, 0x65, 0xe9, 0xaa, 0xf1, 0x99, 0xa3, 0xec, 0x34, 0x3e, 0x73, 0x84, 0xb6, 0xb3, 0x96, 0x8d, + 0x9e, 0x1a, 0xf5, 0x93, 0xa6, 0xbf, 0x37, 0x68, 0x93, 0x08, 0x02, 0x22, 0x22, 0xf0, 0x90, 0x3b, + 0x40, 0x2e, 0xf3, 0x00, 0xb5, 0xb1, 0x68, 0x83, 0x40, 0x2f, 0x18, 0x47, 0x1e, 0x04, 0xe0, 0xe3, + 0x08, 0x90, 0x8b, 0x83, 0xc0, 0xbc, 0x5b, 0xb8, 0x55, 0x5c, 0xa9, 0xf9, 0x47, 0xb1, 0xb5, 0xd0, + 0xbc, 0x71, 0x6c, 0x6d, 0xa5, 0x86, 0x2d, 0x32, 0xcb, 0x76, 0x36, 0x27, 0xe0, 0xbb, 0x83, 0x5d, + 0xe6, 0xc1, 0x53, 0x89, 0x7d, 0xc2, 0x78, 0x3d, 0x43, 0xee, 0xe2, 0x20, 0x30, 0x76, 0xf4, 0xbc, + 0x07, 0x01, 0xe9, 0x03, 0x47, 0xd1, 0x10, 0xb5, 0x19, 0xeb, 0xa0, 0x01, 0x16, 0x34, 0x71, 0x1b, + 0x05, 0x84, 0x92, 0xc8, 0x5c, 0x2e, 0x68, 0xc5, 0x25, 0x67, 0x3d, 0x43, 0x7d, 0x32, 0x7c, 0xca, + 0x58, 0xe7, 0x33, 0x2c, 0x68, 0x03, 0x8b, 0x8f, 0x12, 0x80, 0xf1, 0xbb, 0xa6, 0x6f, 0x52, 0x3c, + 0x44, 0xde, 0xa8, 0x8b, 0x29, 0x71, 0xd1, 0xc9, 0x86, 0xf6, 0xc2, 0x01, 0xe6, 0x1e, 0xc2, 0xde, + 0x97, 0x3d, 0x11, 0x51, 0xe8, 0x46, 0xa6, 0x2e, 0xb7, 0xec, 0x5b, 0x6d, 0xe1, 0x3d, 0xbb, 0xe4, + 0x02, 0xe3, 0xd8, 0x2a, 0x65, 0xdb, 0x78, 0x29, 0xbc, 0xed, 0xbc, 0x43, 0xf1, 0xb0, 0x9e, 0xe2, + 0x6a, 0x69, 0xd6, 0x3d, 0x97, 0xa0, 0x9d, 0x13, 0x8c, 0xf1, 0xa7, 0xa6, 0x17, 0xe7, 0xaa, 0xf3, + 0xd8, 0xa0, 0x7b, 0xd6, 0xc3, 0x7b, 0xd2, 0xc3, 0xef, 0x16, 0xf7, 0xf0, 0xd2, 0x4b, 0x8c, 0x63, + 0xab, 0xf2, 0x2f, 0x3e, 0xce, 0x99, 0x61, 0x3b, 0xef, 0xce, 0x78, 0x59, 0xcf, 0x60, 0x13, 0x7e, + 0x3e, 0xd6, 0xd7, 0x23, 0xcc, 0x7d, 0x88, 0xe4, 0xe6, 0xf7, 0x04, 0x78, 0xb2, 0x00, 0x5a, 0x01, + 0x73, 0x3b, 0xe6, 0x8a, 0xcc, 0x82, 0xb7, 0x52, 0x40, 0x03, 0x8b, 0xe7, 0x02, 0xbc, 0x26, 0xf0, + 0x5a, 0x22, 0x4c, 0x2b, 0x14, 0x0f, 0x67, 0x2a, 0x74, 0xf5, 0xca, 0x15, 0x3a, 0xab, 0x6c, 0xa2, + 0x42, 0x67, 0x85, 0x49, 0x85, 0xa6, 0xa3, 0xa7, 0x15, 0xfa, 0xb5, 0xbe, 0xce, 0xc1, 0x4f, 0x0a, + 0x80, 0xa3, 0x90, 0x91, 0x6e, 0xf2, 0xf4, 0x88, 0xc0, 0xad, 0x00, 0x3c, 0xf3, 0xf5, 0x82, 0x56, + 0xbc, 0x5b, 0xdb, 0x39, 0x8a, 0xad, 0xf3, 0x41, 0xe3, 0xd8, 0x2a, 0xa4, 0x2b, 0x9e, 0x0b, 0xb1, + 0x9d, 0x07, 0xc7, 0xb2, 0x66, 0x2a, 0xaa, 0x67, 0x12, 0x63, 0x5b, 0xdf, 0x10, 0x40, 0x90, 0x10, + 0x11, 0xe3, 0x80, 0x44, 0x16, 0x55, 0x20, 0xe1, 0xc3, 0x87, 0xd5, 0xaa, 0xf9, 0x86, 0x0c, 0xe7, + 0xdb, 0x02, 0xc8, 0x33, 0x09, 0x78, 0x26, 0x83, 0xfa, 0x61, 0x2a, 0xdd, 0x5e, 0xfa, 0xf1, 0x95, + 0x95, 0xb3, 0x5f, 0xde, 0xd6, 0x57, 0xd3, 0x16, 0xd1, 0xe4, 0xf0, 0xe9, 0x07, 0x8f, 0xab, 0xaa, + 0x53, 0xa8, 0x4e, 0xf1, 0xbf, 0x75, 0x8a, 0x2c, 0x29, 0x7f, 0x9e, 0x4a, 0xca, 0x47, 0x55, 0x95, + 0x94, 0xd7, 0x32, 0x29, 0x2f, 0x6e, 0xfb, 0xb7, 0x2f, 0x6a, 0xfb, 0x37, 0x2b, 0xaf, 0x7f, 0x59, + 0x9e, 0xce, 0xeb, 0xf7, 0x55, 0x5e, 0x2b, 0xb2, 0x55, 0xc7, 0x72, 0x75, 0x2c, 0xbf, 0xbe, 0xc7, + 0xf2, 0x8c, 0xd9, 0xfe, 0xd6, 0xa7, 0x99, 0xed, 0x91, 0x62, 0x36, 0xc5, 0x6c, 0x8a, 0xd9, 0x14, + 0xb3, 0xa9, 0x0b, 0x87, 0xff, 0xf4, 0xc2, 0x21, 0xa3, 0xdb, 0xbf, 0xee, 0x4d, 0xd1, 0xed, 0x96, + 0xfa, 0x83, 0xa4, 0xe8, 0x56, 0xd1, 0xad, 0xa2, 0x5b, 0x45, 0xb7, 0x37, 0xea, 0x7e, 0x37, 0x65, + 0xfb, 0x5a, 0x63, 0xef, 0x20, 0xaf, 0xed, 0x1f, 0xe4, 0xb5, 0x3f, 0x0e, 0xf2, 0xda, 0xf7, 0x87, + 0xf9, 0xdc, 0xfe, 0x61, 0x3e, 0xf7, 0xeb, 0x61, 0x3e, 0xf7, 0x79, 0x69, 0x22, 0x1a, 0x02, 0x48, + 0xe9, 0xf8, 0xe3, 0xa0, 0xfc, 0x21, 0xbf, 0x0e, 0x56, 0x86, 0x15, 0xe8, 0xd3, 0x34, 0x30, 0xad, + 0x3b, 0x52, 0xbe, 0xf5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcd, 0x31, 0x09, 0xa0, 0x5a, 0x1c, + 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -940,6 +1037,118 @@ func (m *ParamsPreV606) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ParamsPreV630) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ParamsPreV630) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParamsPreV630) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RegisterPointerDisabled { + i-- + if m.RegisterPointerDisabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x70 + } + { + size := m.MaximumFeePerGas.Size() + i -= size + if _, err := m.MaximumFeePerGas.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + if m.TargetGasUsedPerBlock != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.TargetGasUsedPerBlock)) + i-- + dAtA[i] = 0x60 + } + { + size := m.MaxDynamicBaseFeeDownwardAdjustment.Size() + i -= size + if _, err := m.MaxDynamicBaseFeeDownwardAdjustment.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + { + size := m.MaxDynamicBaseFeeUpwardAdjustment.Size() + i -= size + if _, err := m.MaxDynamicBaseFeeUpwardAdjustment.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + if m.DeliverTxHookWasmGasLimit != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.DeliverTxHookWasmGasLimit)) + i-- + dAtA[i] = 0x48 + } + if len(m.WhitelistedCwCodeHashesForDelegateCall) > 0 { + for iNdEx := len(m.WhitelistedCwCodeHashesForDelegateCall) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.WhitelistedCwCodeHashesForDelegateCall[iNdEx]) + copy(dAtA[i:], m.WhitelistedCwCodeHashesForDelegateCall[iNdEx]) + i = encodeVarintParams(dAtA, i, uint64(len(m.WhitelistedCwCodeHashesForDelegateCall[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + { + size := m.MinimumFeePerGas.Size() + i -= size + if _, err := m.MinimumFeePerGas.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size := m.BaseFeePerGas.Size() + i -= size + if _, err := m.BaseFeePerGas.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.PriorityNormalizer.Size() + i -= size + if _, err := m.PriorityNormalizer.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + return len(dAtA) - i, nil +} + func encodeVarintParams(dAtA []byte, offset int, v uint64) int { offset -= sovParams(v) base := offset @@ -1099,6 +1308,42 @@ func (m *ParamsPreV606) Size() (n int) { return n } +func (m *ParamsPreV630) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.PriorityNormalizer.Size() + n += 1 + l + sovParams(uint64(l)) + l = m.BaseFeePerGas.Size() + n += 1 + l + sovParams(uint64(l)) + l = m.MinimumFeePerGas.Size() + n += 1 + l + sovParams(uint64(l)) + if len(m.WhitelistedCwCodeHashesForDelegateCall) > 0 { + for _, b := range m.WhitelistedCwCodeHashesForDelegateCall { + l = len(b) + n += 1 + l + sovParams(uint64(l)) + } + } + if m.DeliverTxHookWasmGasLimit != 0 { + n += 1 + sovParams(uint64(m.DeliverTxHookWasmGasLimit)) + } + l = m.MaxDynamicBaseFeeUpwardAdjustment.Size() + n += 1 + l + sovParams(uint64(l)) + l = m.MaxDynamicBaseFeeDownwardAdjustment.Size() + n += 1 + l + sovParams(uint64(l)) + if m.TargetGasUsedPerBlock != 0 { + n += 1 + sovParams(uint64(m.TargetGasUsedPerBlock)) + } + l = m.MaximumFeePerGas.Size() + n += 1 + l + sovParams(uint64(l)) + if m.RegisterPointerDisabled { + n += 2 + } + return n +} + func sovParams(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2469,6 +2714,350 @@ func (m *ParamsPreV606) Unmarshal(dAtA []byte) error { } return nil } +func (m *ParamsPreV630) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ParamsPreV630: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ParamsPreV630: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PriorityNormalizer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.PriorityNormalizer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BaseFeePerGas", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.BaseFeePerGas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinimumFeePerGas", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MinimumFeePerGas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WhitelistedCwCodeHashesForDelegateCall", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WhitelistedCwCodeHashesForDelegateCall = append(m.WhitelistedCwCodeHashesForDelegateCall, make([]byte, postIndex-iNdEx)) + copy(m.WhitelistedCwCodeHashesForDelegateCall[len(m.WhitelistedCwCodeHashesForDelegateCall)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeliverTxHookWasmGasLimit", wireType) + } + m.DeliverTxHookWasmGasLimit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeliverTxHookWasmGasLimit |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDynamicBaseFeeUpwardAdjustment", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MaxDynamicBaseFeeUpwardAdjustment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDynamicBaseFeeDownwardAdjustment", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MaxDynamicBaseFeeDownwardAdjustment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetGasUsedPerBlock", wireType) + } + m.TargetGasUsedPerBlock = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TargetGasUsedPerBlock |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaximumFeePerGas", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MaximumFeePerGas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RegisterPointerDisabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RegisterPointerDisabled = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipParams(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/mint/module.go b/x/mint/module.go index b1475b46c8..9a48c2c35c 100644 --- a/x/mint/module.go +++ b/x/mint/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -18,15 +19,18 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/sei-protocol/sei-chain/x/mint/client/cli" "github.com/sei-protocol/sei-chain/x/mint/client/rest" "github.com/sei-protocol/sei-chain/x/mint/keeper" + "github.com/sei-protocol/sei-chain/x/mint/simulation" "github.com/sei-protocol/sei-chain/x/mint/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the mint module. @@ -185,3 +189,30 @@ func NewProposalHandler(k keeper.Keeper) govtypes.Handler { } } } + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the mint module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized mint param changes for the simulator. +func (AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for mint module's types. +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations doesn't return any mint module operation. +func (AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/x/mint/simulation/decoder.go b/x/mint/simulation/decoder.go new file mode 100644 index 0000000000..a22a8cc807 --- /dev/null +++ b/x/mint/simulation/decoder.go @@ -0,0 +1,26 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/sei-protocol/sei-chain/x/mint/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding mint type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key, types.MinterKey): + var minterA, minterB types.Minter + cdc.MustUnmarshal(kvA.Value, &minterA) + cdc.MustUnmarshal(kvB.Value, &minterB) + return fmt.Sprintf("%v\n%v", minterA, minterB) + default: + panic(fmt.Sprintf("invalid mint key %X", kvA.Key)) + } + } +} diff --git a/x/mint/simulation/genesis.go b/x/mint/simulation/genesis.go new file mode 100644 index 0000000000..4518e9f507 --- /dev/null +++ b/x/mint/simulation/genesis.go @@ -0,0 +1,44 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/sei-protocol/sei-chain/x/mint/types" +) + +// RandomizedGenState generates a random GenesisState for mint. +func RandomizedGenState(simState *module.SimulationState) { + mintDenom := sdk.DefaultBondDenom + randomProvision := uint64(rand.Int63n(1000000)) //nolint:gosec + currentDate := time.Now() + // Epochs are every minute, set reduction period to be 1 year + tokenReleaseSchedule := []types.ScheduledTokenRelease{} + + for i := 1; i <= 10; i++ { + scheduledTokenRelease := types.ScheduledTokenRelease{ + StartDate: currentDate.AddDate(1, 0, 0).Format(types.TokenReleaseDateFormat), + EndDate: currentDate.AddDate(3, 0, 0).Format(types.TokenReleaseDateFormat), + TokenReleaseAmount: randomProvision / uint64(i), //nolint:gosec + } + tokenReleaseSchedule = append(tokenReleaseSchedule, scheduledTokenRelease) + } + + params := types.NewParams(mintDenom, tokenReleaseSchedule) + + mintGenesis := types.NewGenesisState(types.InitialMinter(), params) + + bz, err := json.MarshalIndent(&mintGenesis, "", " ") + if err != nil { + panic(err) + } + // TODO: Do some randomization later + fmt.Printf("Selected deterministically generated minting parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(mintGenesis) +} diff --git a/x/oracle/module.go b/x/oracle/module.go index c089d3074f..843635c781 100644 --- a/x/oracle/module.go +++ b/x/oracle/module.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -16,16 +17,19 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/sei-protocol/sei-chain/x/oracle/client/cli" "github.com/sei-protocol/sei-chain/x/oracle/client/rest" "github.com/sei-protocol/sei-chain/x/oracle/keeper" + "github.com/sei-protocol/sei-chain/x/oracle/simulation" "github.com/sei-protocol/sei-chain/x/oracle/types" ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} ) // AppModuleBasic defines the basic application module used by the oracle module. @@ -187,3 +191,36 @@ func (AppModule) ConsensusVersion() uint64 { return 6 } func (am AppModule) MidBlock(ctx sdk.Context, _ int64) { MidBlocker(ctx, am.keeper) } + +// ____________________________________________________________________________ + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the distribution module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalContents returns all the oracle content functions used to +// simulate governance proposals. +func (am AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized oracle param changes for the simulator. +func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { + return simulation.ParamChanges(r) +} + +// RegisterStoreDecoder registers a decoder for oracle module's types +func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) +} + +// WeightedOperations returns the all the oracle module operations with their respective weights. +func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { + return simulation.WeightedOperations( + simState.AppParams, simState.Cdc, + am.accountKeeper, am.bankKeeper, am.keeper, + ) +} diff --git a/x/oracle/simulation/decoder.go b/x/oracle/simulation/decoder.go new file mode 100644 index 0000000000..871409bc5b --- /dev/null +++ b/x/oracle/simulation/decoder.go @@ -0,0 +1,45 @@ +package simulation + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + + "github.com/sei-protocol/sei-chain/x/oracle/types" +) + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding oracle type. +func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { + return func(kvA, kvB kv.Pair) string { + switch { + case bytes.Equal(kvA.Key[:1], types.ExchangeRateKey): + var exchangeRateA, exchangeRateB sdk.DecProto + cdc.MustUnmarshal(kvA.Value, &exchangeRateA) + cdc.MustUnmarshal(kvB.Value, &exchangeRateB) + return fmt.Sprintf("%v\n%v", exchangeRateA, exchangeRateB) + case bytes.Equal(kvA.Key[:1], types.FeederDelegationKey): + return fmt.Sprintf("%v\n%v", sdk.AccAddress(kvA.Value), sdk.AccAddress(kvB.Value)) + case bytes.Equal(kvA.Key[:1], types.VotePenaltyCounterKey): + var counterA, counterB types.VotePenaltyCounter + cdc.MustUnmarshal(kvA.Value, &counterA) + cdc.MustUnmarshal(kvB.Value, &counterB) + return fmt.Sprintf("%v\n%v", counterA, counterB) + case bytes.Equal(kvA.Key[:1], types.AggregateExchangeRateVoteKey): + var voteA, voteB types.AggregateExchangeRateVote + cdc.MustUnmarshal(kvA.Value, &voteA) + cdc.MustUnmarshal(kvB.Value, &voteB) + return fmt.Sprintf("%v\n%v", voteA, voteB) + case bytes.Equal(kvA.Key[:1], types.VoteTargetKey): + var voteTargetA, voteTargetB types.Denom + cdc.MustUnmarshal(kvA.Value, &voteTargetA) + cdc.MustUnmarshal(kvB.Value, &voteTargetB) + return fmt.Sprintf("%v\n%v", voteTargetA, voteTargetB) + default: + panic(fmt.Sprintf("invalid oracle key prefix %X", kvA.Key[:1])) + } + } +} diff --git a/x/oracle/simulation/genesis.go b/x/oracle/simulation/genesis.go new file mode 100644 index 0000000000..9e5fe920fd --- /dev/null +++ b/x/oracle/simulation/genesis.go @@ -0,0 +1,122 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/sei-protocol/sei-chain/x/oracle/types" + "github.com/sei-protocol/sei-chain/x/oracle/utils" +) + +// Simulation parameter constants +const ( + votePeriodKey = "vote_period" + voteThresholdKey = "vote_threshold" + rewardBandKey = "reward_band" + rewardDistributionWindowKey = "reward_distribution_window" //nolint:unused // we will use this later + slashFractionKey = "slash_fraction" + slashWindowKey = "slash_window" + minValidPerWindowKey = "min_valid_per_window" +) + +// GenVotePeriod randomized VotePeriod +func GenVotePeriod(r *rand.Rand) uint64 { + return uint64(1 + r.Intn(100)) //nolint:gosec +} + +// GenVoteThreshold randomized VoteThreshold +func GenVoteThreshold(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(333, 3).Add(sdk.NewDecWithPrec(int64(r.Intn(333)), 3)) +} + +// GenRewardBand randomized RewardBand +func GenRewardBand(r *rand.Rand) sdk.Dec { + return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(100)), 3)) +} + +// GenSlashFraction randomized SlashFraction +func GenSlashFraction(r *rand.Rand) sdk.Dec { + return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(100)), 3)) +} + +// GenSlashWindow randomized SlashWindow +func GenSlashWindow(r *rand.Rand) uint64 { + return uint64(100 + r.Intn(100000)) //nolint:gosec +} + +// GenMinValidPerWindow randomized MinValidPerWindow +func GenMinValidPerWindow(r *rand.Rand) sdk.Dec { + return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(500)), 3)) +} + +// RandomizedGenState generates a random GenesisState for oracle +func RandomizedGenState(simState *module.SimulationState) { + var votePeriod uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, votePeriodKey, &votePeriod, simState.Rand, + func(r *rand.Rand) { votePeriod = GenVotePeriod(r) }, + ) + + var voteThreshold sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, voteThresholdKey, &voteThreshold, simState.Rand, + func(r *rand.Rand) { voteThreshold = GenVoteThreshold(r) }, + ) + + var rewardBand sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, rewardBandKey, &rewardBand, simState.Rand, + func(r *rand.Rand) { rewardBand = GenRewardBand(r) }, + ) + + var slashFraction sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, slashFractionKey, &slashFraction, simState.Rand, + func(r *rand.Rand) { slashFraction = GenSlashFraction(r) }, + ) + + var slashWindow uint64 + simState.AppParams.GetOrGenerate( + simState.Cdc, slashWindowKey, &slashWindow, simState.Rand, + func(r *rand.Rand) { slashWindow = GenSlashWindow(r) }, + ) + + var minValidPerWindow sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, minValidPerWindowKey, &minValidPerWindow, simState.Rand, + func(r *rand.Rand) { minValidPerWindow = GenMinValidPerWindow(r) }, + ) + + oracleGenesis := types.NewGenesisState( + types.Params{ + VotePeriod: votePeriod, + VoteThreshold: voteThreshold, + RewardBand: rewardBand, + Whitelist: types.DenomList{ + {Name: utils.MicroSeiDenom}, + {Name: utils.MicroAtomDenom}, + }, + SlashFraction: slashFraction, + SlashWindow: slashWindow, + MinValidPerWindow: minValidPerWindow, + }, + []types.ExchangeRateTuple{}, + []types.FeederDelegation{}, + []types.PenaltyCounter{}, + []types.AggregateExchangeRateVote{}, + types.PriceSnapshots{}, + ) + + bz, err := json.MarshalIndent(&oracleGenesis.Params, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated oracle parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(oracleGenesis) +} diff --git a/x/oracle/simulation/operations.go b/x/oracle/simulation/operations.go new file mode 100644 index 0000000000..dd9fba925f --- /dev/null +++ b/x/oracle/simulation/operations.go @@ -0,0 +1,177 @@ +package simulation + +// DONTCOVER + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + seiappparams "github.com/sei-protocol/sei-chain/app/params" + + "github.com/sei-protocol/sei-chain/x/oracle/keeper" + "github.com/sei-protocol/sei-chain/x/oracle/types" +) + +// Simulation operation weights constants +// +//nolint:gosec +const ( + OpWeightMsgAggregateExchangeRateVote = "op_weight_msg_exchange_rate_aggregate_vote" + OpWeightMsgDelegateFeedConsent = "op_weight_msg_exchange_feed_consent" +) + +var voteHashMap = make(map[string]string) + +// WeightedOperations returns all the operations from the module with their respective weights +func WeightedOperations( + appParams simtypes.AppParams, + cdc codec.JSONCodec, + ak types.AccountKeeper, + bk types.BankKeeper, + k keeper.Keeper, +) simulation.WeightedOperations { + var ( + weightMsgAggregateExchangeRateVote int + weightMsgDelegateFeedConsent int + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgAggregateExchangeRateVote, &weightMsgAggregateExchangeRateVote, nil, + func(_ *rand.Rand) { + weightMsgAggregateExchangeRateVote = seiappparams.DefaultWeightMsgSend * 2 + }, + ) + + appParams.GetOrGenerate(cdc, OpWeightMsgDelegateFeedConsent, &weightMsgDelegateFeedConsent, nil, + func(_ *rand.Rand) { + weightMsgDelegateFeedConsent = seiappparams.DefaultWeightMsgSetWithdrawAddress + }, + ) + + return simulation.WeightedOperations{ + simulation.NewWeightedOperation( + weightMsgAggregateExchangeRateVote, + SimulateMsgAggregateExchangeRateVote(ak, bk, k), + ), + simulation.NewWeightedOperation( + weightMsgDelegateFeedConsent, + SimulateMsgDelegateFeedConsent(ak, bk, k), + ), + } +} + +// SimulateMsgAggregateExchangeRateVote generates a MsgAggregateExchangeRateVote with random values. +// nolint: funlen +func SimulateMsgAggregateExchangeRateVote(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + address := sdk.ValAddress(simAccount.Address) + + // ensure the validator exists + val := k.StakingKeeper.Validator(ctx, address) + if val == nil || !val.IsBonded() { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgAggregateExchangeRateVote, "unable to find validator"), nil, nil + } + + // ensure vote hash exists + exchangeRatesStr, ok := voteHashMap[address.String()] + if !ok { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgAggregateExchangeRateVote, "vote hash not exists"), nil, nil + } + + feederAddr := k.GetFeederDelegation(ctx, address) + feederSimAccount, _ := simtypes.FindAccount(accs, feederAddr) + feederAccount := ak.GetAccount(ctx, feederAddr) + spendableCoins := bk.SpendableCoins(ctx, feederAddr) + + fees, err := simtypes.RandomFees(r, ctx, spendableCoins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgAggregateExchangeRateVote, "unable to generate fees"), nil, err + } + + msg := types.NewMsgAggregateExchangeRateVote(exchangeRatesStr, feederAddr, address) + + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{feederAccount.GetAccountNumber()}, + []uint64{feederAccount.GetSequence()}, + feederSimAccount.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err + } + + _, _, err = app.Deliver(txGen.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} + +// SimulateMsgDelegateFeedConsent generates a MsgDelegateFeedConsent with random values. +// nolint: funlen +func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + simAccount, _ := simtypes.RandomAcc(r, accs) + delegateAccount, _ := simtypes.RandomAcc(r, accs) + valAddress := sdk.ValAddress(simAccount.Address) + delegateValAddress := sdk.ValAddress(delegateAccount.Address) + account := ak.GetAccount(ctx, simAccount.Address) + + // ensure the validator exists + val := k.StakingKeeper.Validator(ctx, valAddress) + if val == nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegateFeedConsent, "unable to find validator"), nil, nil + } + + // ensure the target address is not a validator + val2 := k.StakingKeeper.Validator(ctx, delegateValAddress) + if val2 != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegateFeedConsent, "unable to delegate to validator"), nil, nil + } + + spendableCoins := bk.SpendableCoins(ctx, account.GetAddress()) + fees, err := simtypes.RandomFees(r, ctx, spendableCoins) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgAggregateExchangeRateVote, "unable to generate fees"), nil, err + } + + msg := types.NewMsgDelegateFeedConsent(valAddress, delegateAccount.Address) + + txGen := seiappparams.MakeEncodingConfig().TxConfig + tx, err := simulation.GenTx( + txGen, + []sdk.Msg{msg}, + fees, + simulation.DefaultGenTxGas, + chainID, + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + simAccount.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err + } + + _, _, err = app.Deliver(txGen.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err + } + + return simtypes.NewOperationMsg(msg, true, "", nil), nil, nil + } +} diff --git a/x/oracle/simulation/params.go b/x/oracle/simulation/params.go new file mode 100644 index 0000000000..3015677bbe --- /dev/null +++ b/x/oracle/simulation/params.go @@ -0,0 +1,45 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + + "github.com/sei-protocol/sei-chain/x/oracle/types" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(_ *rand.Rand) []simtypes.ParamChange { + return []simtypes.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.KeyVotePeriod), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenVotePeriod(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyVoteThreshold), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenVoteThreshold(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeyRewardBand), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenRewardBand(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeySlashFraction), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenSlashFraction(r)) + }, + ), + simulation.NewSimParamChange(types.ModuleName, string(types.KeySlashWindow), + func(r *rand.Rand) string { + return fmt.Sprintf("\"%d\"", GenSlashWindow(r)) + }, + ), + } +} diff --git a/x/tokenfactory/module.go b/x/tokenfactory/module.go index 56af911577..e88d08bfa1 100644 --- a/x/tokenfactory/module.go +++ b/x/tokenfactory/module.go @@ -12,6 +12,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -23,6 +24,7 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/sei-protocol/sei-chain/x/tokenfactory/client/cli" "github.com/sei-protocol/sei-chain/x/tokenfactory/keeper" "github.com/sei-protocol/sei-chain/x/tokenfactory/types" @@ -193,3 +195,31 @@ func (am AppModuleBasic) ValidateGenesisStream(cdc codec.JSONCodec, config clien // ConsensusVersion implements ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return 5 } + +// ___________________________________________________________________________ + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the tokenfactory module. +func (am AppModule) GenerateGenesisState(simState *module.SimulationState) { + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (am AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { + return nil +} + +// RandomizedParams creates randomized txfees param changes for the simulator. +func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { + return nil +} + +// RegisterStoreDecoder registers a decoder for tokenfactory module's types +func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { +} + +// WeightedOperations returns simulator module operations with their respective weights. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +}