diff --git a/.env b/.env
index 996bb6e6b..c9bb883c4 100644
--- a/.env
+++ b/.env
@@ -15,35 +15,37 @@ ASYNC_STD_THREAD_COUNT=1
PROVER_RAYON_NUM_THREADS=2
# Internal port inside container
-ESPRESSO_CDN_SERVER_PORT=40000
+ESPRESSO_CDN_SERVER_PORT=30000
ESPRESSO_CDN_SERVER_METRICS_PORT=9090
-ESPRESSO_ORCHESTRATOR_PORT=40001
+ESPRESSO_ORCHESTRATOR_PORT=30001
ESPRESSO_ORCHESTRATOR_NUM_NODES=5
ESPRESSO_ORCHESTRATOR_START_DELAY=5s
-ESPRESSO_ORCHESTRATOR_NEXT_VIEW_TIMEOUT=30s
+ESPRESSO_ORCHESTRATOR_NEXT_VIEW_TIMEOUT=12s
ESPRESSO_ORCHESTRATOR_BUILDER_TIMEOUT=2s
ESPRESSO_SEQUENCER_CDN_ENDPOINT=marshal-0:${ESPRESSO_CDN_SERVER_PORT}
ESPRESSO_SEQUENCER_ORCHESTRATOR_URL=http://orchestrator:${ESPRESSO_ORCHESTRATOR_PORT}
-ESPRESSO_SEQUENCER_API_PORT=44000
-ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT=42000
-ESPRESSO_SEQUENCER1_API_PORT=44001
-ESPRESSO_SEQUENCER2_API_PORT=44002
-ESPRESSO_SEQUENCER3_API_PORT=44003
-ESPRESSO_SEQUENCER4_API_PORT=44004
-ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE=10kb
-ESPRESSO_SEQUENCER_BASE_FEE=1
+ESPRESSO_SEQUENCER_API_PORT=24000
+ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT=22000
+ESPRESSO_SEQUENCER1_API_PORT=24001
+ESPRESSO_SEQUENCER2_API_PORT=24002
+ESPRESSO_SEQUENCER3_API_PORT=24003
+ESPRESSO_SEQUENCER4_API_PORT=24004
ESPRESSO_SEQUENCER_URL=http://sequencer0:${ESPRESSO_SEQUENCER_API_PORT}
+ESPRESSO_SEQUENCER_MAX_CONNECTIONS=25
ESPRESSO_SEQUENCER_STORAGE_PATH=/store/sequencer
+ESPRESSO_SEQUENCER_GENESIS_FILE=/genesis/demo.toml
ESPRESSO_SEQUENCER_L1_PORT=8545
ESPRESSO_SEQUENCER_L1_WS_PORT=8546
ESPRESSO_SEQUENCER_L1_PROVIDER=http://demo-l1-network:${ESPRESSO_SEQUENCER_L1_PORT}
+# Only allow 1 block to be processed for events at a time, simulating a very bad L1 provider.
+ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE=1
ESPRESSO_SEQUENCER_ETH_MNEMONIC="test test test test test test test test test test test junk"
-# The first account is the permission less builder, the last are sequencer0 to 4
-ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS=0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f
-ESPRESSO_COMMITMENT_TASK_PORT=60000
-ESPRESSO_SEQUENCER_DB_PORT=5432
-ESPRESSO_STATE_RELAY_SERVER_PORT=40004
+ESPRESSO_COMMITMENT_TASK_PORT=30010
+ESPRESSO_SEQUENCER0_DB_PORT=5432
+ESPRESSO_SEQUENCER1_DB_PORT=5433
+ESPRESSO_STATE_RELAY_SERVER_PORT=30011
ESPRESSO_STATE_RELAY_SERVER_URL=http://state-relay-server:${ESPRESSO_STATE_RELAY_SERVER_PORT}
+ESPRESSO_BLOCK_EXPLORER_PORT=3000
# Ethereum accounts (note 11-15 are used by the sequencer nodes)
ESPRESSO_SEQUENCER_HOTSHOT_ACCOUNT_INDEX=5
@@ -52,8 +54,8 @@ ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX=8
ESPRESSO_DEPLOYER_ACCOUNT_INDEX=9
# Contracts
-ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS=0x700b6a60ce7eaaea56f065753d8dcb9653dbad35
-ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS=0xe1aa25618fa0c7a1cfdab5d6b456af611873b629
+ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS=0xb19b36b1456e65e3a6d514d3f715f204bd59f431
+ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS=0x0c8e79f3534b00d9a3d4a856b665bf4ebc22f2ba
ESPRESSO_SEQUENCER_LIGHTCLIENT_ADDRESS=$ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS
# Example sequencer demo private keys
@@ -76,6 +78,9 @@ ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2=7002
ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3=7003
ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4=7004
+# The demo uses the mock stake table contract, only capacity 10 is supported.
+ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10
+
# Foundry
# The mnemonic used by foundry to deploy contracts.
MNEMONIC="test test test test test test test test test test test junk"
@@ -86,31 +91,34 @@ ETHERSCAN_API_KEY="placeholder"
# Temporary flags for state relay server, should remove after integrating with stake table
# Related issue: [https://github.com/EspressoSystems/espresso-sequencer/issues/1022]
-ESPRESSO_STATE_SIGNATURE_WEIGHT_THRESHOLD=3
+ESPRESSO_STATE_SIGNATURE_TOTAL_STAKE=5
# Prover service
-ESPRESSO_PROVER_SERVICE_PORT=40050
-ESPRESSO_STATE_PROVER_UPDATE_INTERVAL=10m
+ESPRESSO_PROVER_SERVICE_PORT=30050
+ESPRESSO_STATE_PROVER_UPDATE_INTERVAL=20s
# Builder service
ESPRESSO_BUILDER_L1_PROVIDER=${ESPRESSO_SEQUENCER_L1_PROVIDER}
ESPRESSO_BUILDER_ETH_MNEMONIC=${ESPRESSO_SEQUENCER_ETH_MNEMONIC}
-ESPRESSO_BUILDER_SERVER_PORT=41003
-ESPRESSO_BUILDER_CHANNEL_CAPACITY=1024
+ESPRESSO_BUILDER_SERVER_PORT=31003
+ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY=4096
+ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY=128
+ESPRESSO_BUILDER_INIT_NODE_COUNT=$ESPRESSO_ORCHESTRATOR_NUM_NODES
ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW=0
-ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION=1s
-ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT=15
+ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION=1500ms
+ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT=50
+ESPRESSO_BUILDER_GENESIS_FILE=$ESPRESSO_SEQUENCER_GENESIS_FILE
# Load generator
ESPRESSO_SUBMIT_TRANSACTIONS_DELAY=2s
-ESPRESSO_SUBMIT_TRANSACTIONS_PUBLIC_PORT=44010
-ESPRESSO_SUBMIT_TRANSACTIONS_PRIVATE_PORT=44020
+ESPRESSO_SUBMIT_TRANSACTIONS_PUBLIC_PORT=24010
+ESPRESSO_SUBMIT_TRANSACTIONS_PRIVATE_PORT=24020
-# Query service stress test
-ESPRESSO_NASTY_CLIENT_PORT=44011
+# Query service fetch requests rate limit
+ESPRESSO_SEQUENCER_FETCH_RATE_LIMIT=25
# Query service stress test
-ESPRESSO_NASTY_CLIENT_PORT=44011
+ESPRESSO_NASTY_CLIENT_PORT=24011
# Openzeppelin Defender Deployment Profile
DEFENDER_KEY=
@@ -120,3 +128,12 @@ LIGHT_CLIENT_SALT=12
FEE_CONTRACT_UPGRADE_NAME="FeeContract.sol"
LIGHT_CLIENT_UPGRADE_NAME="LightClientV2.sol"
FOUNDRY_OUT=contracts/out
+
+# The Ethereum address of the safe multisig wallet used to deploy and operate the contracts.
+SAFE_MULTISIG_ADDRESS=
+# The Ethereum private key of the wallet used for the proposing multisig transactions.
+SAFE_ORCHESTRATOR_PRIVATE_KEY=
+
+# Light Client
+LIGHT_CLIENT_CONTRACT_ADDRESS=
+APPROVED_PROVER_ADDRESS=
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8191c0344..49b9f68a7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -52,6 +52,11 @@ jobs:
run: |
cargo build --locked --release --workspace
+ - name: Build Espresso Dev Node
+ # Espresso Dev Node currently requires testing feature, so it is built separately.
+ run: |
+ cargo build --locked --release --features testing --bin espresso-dev-node
+
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
@@ -72,7 +77,9 @@ jobs:
target/release/keygen
target/release/permissionless-builder
target/release/nasty-client
+ target/release/espresso-dev-node
target/release/pub-key
+ target/release/espresso-bridge
build-arm:
runs-on: buildjet-4vcpu-ubuntu-2204-arm
@@ -96,6 +103,11 @@ jobs:
run: |
cargo build --locked --release --workspace
+ - name: Build Espresso Dev Node
+ # Espresso Dev Node currently requires testing feature, so it is built separately.
+ run: |
+ cargo build --locked --release --features testing --bin espresso-dev-node
+
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
@@ -116,7 +128,9 @@ jobs:
target/release/keygen
target/release/permissionless-builder
target/release/nasty-client
+ target/release/espresso-dev-node
target/release/pub-key
+ target/release/espresso-bridge
build-dockers:
runs-on: ubuntu-latest
@@ -134,6 +148,8 @@ jobs:
deploy-tag: ${{ steps.deploy.outputs.tags }}
builder-tag: ${{ steps.builder.outputs.tags }}
nasty-client-tag: ${{ steps.nasty-client.outputs.tags }}
+ espresso-dev-node-tag: ${{ steps.espresso-dev-node.outputs.tags }}
+ bridge-tag: ${{ steps.bridge.outputs.tags }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
@@ -235,8 +251,20 @@ jobs:
with:
images: ghcr.io/espressosystems/espresso-sequencer/nasty-client
+ - name: Generate espresso-dev-node metadata
+ uses: docker/metadata-action@v5
+ id: espresso-dev-node
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/espresso-dev-node
+
+ - name: Generate bridge metadata
+ uses: docker/metadata-action@v5
+ id: bridge
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/bridge
+
- name: Build and push sequencer docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/sequencer.Dockerfile
@@ -246,7 +274,7 @@ jobs:
labels: ${{ steps.sequencer.outputs.labels }}
- name: Build and push cdn-broker docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-broker.Dockerfile
@@ -256,7 +284,7 @@ jobs:
labels: ${{ steps.cdn-broker.outputs.labels }}
- name: Build and push cdn-marshal docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-marshal.Dockerfile
@@ -266,7 +294,7 @@ jobs:
labels: ${{ steps.cdn-marshal.outputs.labels }}
- name: Build and push cdn-whitelist docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-whitelist.Dockerfile
@@ -276,7 +304,7 @@ jobs:
labels: ${{ steps.cdn-whitelist.outputs.labels }}
- name: Build and push state-relay-server docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/state-relay-server.Dockerfile
@@ -286,7 +314,7 @@ jobs:
labels: ${{ steps.state-relay-server.outputs.labels }}
- name: Build and push prover-service docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/prover-service.Dockerfile
@@ -296,7 +324,7 @@ jobs:
labels: ${{ steps.prover-service.outputs.labels }}
- name: Build and push orchestrator docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/orchestrator.Dockerfile
@@ -306,7 +334,7 @@ jobs:
labels: ${{ steps.orchestrator.outputs.labels }}
- name: Build and push commitment-task docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/commitment-task.Dockerfile
@@ -316,7 +344,7 @@ jobs:
labels: ${{ steps.commitment-task.outputs.labels }}
- name: Build and push submit-transactions docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/submit-transactions.Dockerfile
@@ -326,7 +354,7 @@ jobs:
labels: ${{ steps.submit-transactions.outputs.labels }}
- name: Build and push deploy docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/deploy.Dockerfile
@@ -336,7 +364,7 @@ jobs:
labels: ${{ steps.deploy.outputs.labels }}
- name: Build and push builder docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/permissionless-builder.Dockerfile
@@ -346,7 +374,7 @@ jobs:
labels: ${{ steps.builder.outputs.labels }}
- name: Build and push nasty-client docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/nasty-client.Dockerfile
@@ -355,6 +383,25 @@ jobs:
tags: ${{ steps.nasty-client.outputs.tags }}
labels: ${{ steps.nasty-client.outputs.labels }}
+ - name: Build and push espresso-dev-node docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-dev-node.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.espresso-dev-node.outputs.tags }}
+ labels: ${{ steps.espresso-dev-node.outputs.labels }}
+ - name: Build and push bridge docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-bridge.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.bridge.outputs.tags }}
+ labels: ${{ steps.bridge.outputs.labels }}
+
test-demo:
if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
@@ -382,6 +429,7 @@ jobs:
docker pull ${{ needs.build-dockers.outputs.deploy-tag }}
docker pull ${{ needs.build-dockers.outputs.builder-tag }}
docker pull ${{ needs.build-dockers.outputs.nasty-client-tag }}
+ docker pull ${{ needs.build-dockers.outputs.bridge-tag }}
- name: Tag new docker images
run: |
docker tag ${{ needs.build-dockers.outputs.sequencer-tag }} ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -396,8 +444,9 @@ jobs:
docker tag ${{ needs.build-dockers.outputs.deploy-tag }} ghcr.io/espressosystems/espresso-sequencer/deploy:main
docker tag ${{ needs.build-dockers.outputs.builder-tag }} ghcr.io/espressosystems/espresso-sequencer/builder:main
docker tag ${{ needs.build-dockers.outputs.nasty-client-tag }} ghcr.io/espressosystems/espresso-sequencer/nasty-client:main
+ docker tag ${{ needs.build-dockers.outputs.bridge-tag }} ghcr.io/espressosystems/espresso-sequencer/bridge:main
- name: Test docker demo
run: |
just demo &
- timeout 600 scripts/smoke-test-demo
+ timeout -v 600 scripts/smoke-test-demo | sed -e 's/^/smoke-test: /;'
diff --git a/.github/workflows/build_static.yml b/.github/workflows/build_static.yml
index e0727ca09..0d533fd38 100644
--- a/.github/workflows/build_static.yml
+++ b/.github/workflows/build_static.yml
@@ -43,10 +43,10 @@ jobs:
uses: actions/checkout@v4
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Enable Cachix
- uses: cachix/cachix-action@v14
+ uses: cachix/cachix-action@v15
# If PR is from a non-collaborator (e. g. dependabot) the secrets are missing and the login to cachix fails.
continue-on-error: true
with:
@@ -89,6 +89,8 @@ jobs:
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/deploy
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/keygen
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/pub-key
+ ${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/espresso-bridge
+ ${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/espresso-dev-node
static-dockers:
runs-on: ubuntu-latest
@@ -192,8 +194,22 @@ jobs:
images: ghcr.io/espressosystems/espresso-sequencer/deploy
flavor: suffix=musl
+ - name: Generate espresso-dev-node metadata
+ uses: docker/metadata-action@v5
+ id: espresso-dev-node
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/espresso-dev-node
+ flavor: suffix=musl
+
+ - name: Generate bridge metadata
+ uses: docker/metadata-action@v5
+ id: bridge
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/bridge
+ flavor: suffix=musl
+
- name: Build and push sequencer docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/sequencer.Dockerfile
@@ -203,7 +219,7 @@ jobs:
labels: ${{ steps.sequencer.outputs.labels }}
- name: Build and push cdn-broker docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-broker.Dockerfile
@@ -213,7 +229,7 @@ jobs:
labels: ${{ steps.cdn-broker.outputs.labels }}
- name: Build and push cdn-marshal docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-marshal.Dockerfile
@@ -223,7 +239,7 @@ jobs:
labels: ${{ steps.cdn-marshal.outputs.labels }}
- name: Build and push cdn-whitelist docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-whitelist.Dockerfile
@@ -233,7 +249,7 @@ jobs:
labels: ${{ steps.cdn-whitelist.outputs.labels }}
- name: Build and push state-relay-server docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/state-relay-server.Dockerfile
@@ -243,7 +259,7 @@ jobs:
labels: ${{ steps.state-relay-server.outputs.labels }}
- name: Build and push prover-service docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/prover-service.Dockerfile
@@ -253,7 +269,7 @@ jobs:
labels: ${{ steps.prover-service.outputs.labels }}
- name: Build and push orchestrator docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/orchestrator.Dockerfile
@@ -263,7 +279,7 @@ jobs:
labels: ${{ steps.orchestrator.outputs.labels }}
- name: Build and push commitment-task docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/commitment-task.Dockerfile
@@ -273,7 +289,7 @@ jobs:
labels: ${{ steps.commitment-task.outputs.labels }}
- name: Build and push submit-transactions docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/submit-transactions.Dockerfile
@@ -283,7 +299,7 @@ jobs:
labels: ${{ steps.submit-transactions.outputs.labels }}
- name: Build and push deploy docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/deploy.Dockerfile
@@ -291,3 +307,23 @@ jobs:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.deploy.outputs.tags }}
labels: ${{ steps.deploy.outputs.labels }}
+
+ - name: Build and push dev node docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-dev-node.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.espresso-dev-node.outputs.tags }}
+ labels: ${{ steps.espresso-dev-node.outputs.labels }}
+
+ - name: Build and push bridge docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-bridge.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.bridge.outputs.tags }}
+ labels: ${{ steps.bridge.outputs.labels }}
diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml
index 0847511f7..0d5fad542 100644
--- a/.github/workflows/contracts.yml
+++ b/.github/workflows/contracts.yml
@@ -25,10 +25,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Enable Cachix
- uses: cachix/cachix-action@v14
+ uses: cachix/cachix-action@v15
# If PR is from a non-collaborator (e. g. dependabot) the secrets are missing and the login to cachix fails.
continue-on-error: true
with:
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
new file mode 100644
index 000000000..2f4449213
--- /dev/null
+++ b/.github/workflows/doc.yml
@@ -0,0 +1,49 @@
+name: Documentation
+on:
+ push:
+ branches:
+ - "main"
+ - "release-*"
+ pull_request:
+ schedule:
+ - cron: "0 0 * * 1"
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ (github.ref == 'refs/heads/main' && github.run_number) || github.ref }}
+ cancel-in-progress: true
+
+env:
+ RUSTFLAGS: --cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std"
+ RUSTDOCFLAGS: --cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std"
+
+jobs:
+ doc:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4
+
+ - name: Install Just
+ run: sudo apt-get install -y just
+
+ - uses: Swatinem/rust-cache@v2
+ name: Enable Rust Caching
+
+ - name: Build Docs
+ run: |
+ just doc
+
+ - name: Create documentation
+ if: ${{ github.ref == 'refs/heads/main' }}
+ run: |
+ cp -R target/doc public
+ echo '' > public/index.html
+
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v4
+ if: ${{ github.ref == 'refs/heads/main' }}
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./public
+ cname: sequencer.docs.espressosys.com
diff --git a/.github/workflows/test-demo-native.yml b/.github/workflows/test-demo-native.yml
index 90666c366..ab85b1a75 100644
--- a/.github/workflows/test-demo-native.yml
+++ b/.github/workflows/test-demo-native.yml
@@ -29,7 +29,7 @@ jobs:
uses: foundry-rs/foundry-toolchain@v1
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Install process-compose
run: |
@@ -50,4 +50,4 @@ jobs:
run: |
export PATH="$PWD/target/release:$PATH"
scripts/demo-native --tui=false &
- timeout -v 600 scripts/smoke-test-demo
+ timeout -v 600 scripts/smoke-test-demo | sed -e 's/^/smoke-test: /;'
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 37c4c45fd..b50fdfece 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -55,4 +55,4 @@ jobs:
cargo build --locked --bin diff-test --release
cargo test --locked --release --workspace --all-features --no-run
cargo test --locked --release --workspace --all-features --verbose -- --test-threads 1 --nocapture
- timeout-minutes: 30
+ timeout-minutes: 40
diff --git a/.github/workflows/update_nix.yml b/.github/workflows/update_nix.yml
index a2783722c..f7dfd33f6 100644
--- a/.github/workflows/update_nix.yml
+++ b/.github/workflows/update_nix.yml
@@ -17,9 +17,9 @@ jobs:
uses: actions/checkout@v4
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- - uses: cachix/cachix-action@v14
+ - uses: cachix/cachix-action@v15
with:
name: espresso-systems-private
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
diff --git a/.gitignore b/.gitignore
index fac0a2025..4503c6c73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,9 +14,7 @@ target/
# Jetbrains editor
.idea
-
-# vscode stuff
-.vscode/settings.json
+.vscode/ltex.dictionary*
node_modules/
@@ -26,3 +24,20 @@ node_modules/
cache
**/*.bin
+
+
+yarn.lock
+
+# wake files
+.wake
+.env
+pytypes
+__pycache__/
+*.py[cod]
+.hypothesis/
+wake-coverage.cov
+!data/*.bin
+
+# generated by failing serialization tests
+data/*-actual.json
+data/*-actual.bin
diff --git a/.gitmodules b/.gitmodules
index 1dbb51036..d4556787d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,7 +19,7 @@
[submodule "contracts/lib/openzeppelin-foundry-upgrades"]
path = contracts/lib/openzeppelin-foundry-upgrades
url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades
- branch = 0.1.0
+ branch = 0.2.3
[submodule "contracts/lib/openzeppelin-contracts-upgradeable"]
path = contracts/lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
diff --git a/.typos.toml b/.typos.toml
index 71189ef29..53cdcf235 100644
--- a/.typos.toml
+++ b/.typos.toml
@@ -1,7 +1,7 @@
[files]
extend-exclude = [
+ "*.json",
"doc/*.svg",
- "geth-config/*.json",
"contracts/lib",
"contract-bindings",
]
diff --git a/.vscode/ltex.dictionary.en-US.txt b/.vscode/ltex.dictionary.en-US.txt
new file mode 100644
index 000000000..12589cd69
--- /dev/null
+++ b/.vscode/ltex.dictionary.en-US.txt
@@ -0,0 +1,4 @@
+Multisig
+OpenZeppelin
+multisig
+Metamask
diff --git a/.vscode/settings.json.example b/.vscode/settings.json
similarity index 100%
rename from .vscode/settings.json.example
rename to .vscode/settings.json
diff --git a/Cargo.lock b/Cargo.lock
index 8efc37181..64ea70564 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -122,7 +122,7 @@ version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"version_check",
]
@@ -134,7 +134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"version_check",
"zerocopy",
@@ -172,47 +172,48 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.13"
+version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.6"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
[[package]]
name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.2"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
@@ -220,9 +221,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.82"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "arbitrary"
@@ -401,17 +402,6 @@ dependencies = [
"syn 1.0.109",
]
-[[package]]
-name = "ark-pallas"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "760ecac12a00211188c9101b63bd284b80da5abcc5d97d9d2b3803bca1f63a52"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
[[package]]
name = "ark-poly"
version = "0.4.2"
@@ -547,9 +537,9 @@ dependencies = [
[[package]]
name = "asn1-rs"
-version = "0.5.2"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0"
+checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d"
dependencies = [
"asn1-rs-derive",
"asn1-rs-impl",
@@ -563,25 +553,25 @@ dependencies = [
[[package]]
name = "asn1-rs-derive"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c"
+checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
- "synstructure 0.12.6",
+ "syn 2.0.67",
+ "synstructure 0.13.1",
]
[[package]]
name = "asn1-rs-impl"
-version = "0.1.0"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed"
+checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.67",
]
[[package]]
@@ -602,12 +592,12 @@ dependencies = [
[[package]]
name = "async-broadcast"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
+checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e"
dependencies = [
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
"futures-core",
"pin-project-lite 0.2.14",
]
@@ -625,28 +615,27 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "2.2.1"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
dependencies = [
"concurrent-queue",
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener-strategy",
"futures-core",
"pin-project-lite 0.2.14",
]
[[package]]
name = "async-compatibility-layer"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7d24a8f9d6fec5b9313ceebbd82133ae87cf94944c362e8169d7ec735c88a23"
+checksum = "2c928880329566b45c159fca61fbc2a1d301a7e5fd2a0e94c17476bb1a3ea526"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"color-eyre",
- "console-subscriber",
+ "console-subscriber 0.2.0",
"flume 0.11.0",
"futures",
"tokio",
@@ -662,15 +651,15 @@ version = "1.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c2886ab563af5038f79ec016dd7b87947ed138b794e8dd64992962c9cca0411"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"futures-io",
]
[[package]]
name = "async-executor"
-version = "1.11.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a"
+checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
dependencies = [
"async-task",
"concurrent-queue",
@@ -697,10 +686,10 @@ version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-executor",
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.3",
+ "async-lock 3.4.0",
"blocking",
"futures-lite 2.3.0",
"once_cell",
@@ -746,17 +735,17 @@ dependencies = [
[[package]]
name = "async-io"
-version = "2.3.2"
+version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
+checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite 2.3.0",
"parking",
- "polling 3.7.0",
+ "polling 3.7.2",
"rustix 0.38.34",
"slab",
"tracing",
@@ -774,12 +763,12 @@ dependencies = [
[[package]]
name = "async-lock"
-version = "3.3.0"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
dependencies = [
- "event-listener 4.0.3",
- "event-listener-strategy 0.4.0",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
"pin-project-lite 0.2.14",
]
@@ -831,12 +820,12 @@ dependencies = [
[[package]]
name = "async-signal"
-version = "0.2.6"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda"
+checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d"
dependencies = [
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.3",
+ "async-lock 3.4.0",
"atomic-waker",
"cfg-if",
"futures-core",
@@ -923,7 +912,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -953,7 +942,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -1056,14 +1045,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "autocfg"
-version = "1.2.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "automod"
@@ -1073,7 +1062,7 @@ checksum = "edf3ee19dbc0a46d740f6f0926bde8c50f02bdbc7b536842da28f6ac56513a8b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -1089,7 +1078,7 @@ dependencies = [
"futures-util",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"itoa",
"matchit",
"memchr",
@@ -1098,7 +1087,7 @@ dependencies = [
"pin-project-lite 0.2.14",
"rustversion",
"serde",
- "sync_wrapper",
+ "sync_wrapper 0.1.2",
"tower",
"tower-layer",
"tower-service",
@@ -1162,9 +1151,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64"
-version = "0.22.0"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "base64-bytes"
@@ -1172,7 +1161,7 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ce54e4e485fa0eed9c3aa5348162be09168f75bb5be7bc6587bcf2a65ee1386"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"serde",
]
@@ -1291,12 +1280,11 @@ dependencies = [
[[package]]
name = "blocking"
-version = "1.6.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88"
+checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
dependencies = [
- "async-channel 2.2.1",
- "async-lock 3.3.0",
+ "async-channel 2.3.1",
"async-task",
"futures-io",
"futures-lite 2.3.0",
@@ -1305,9 +1293,9 @@ dependencies = [
[[package]]
name = "blst"
-version = "0.3.11"
+version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b"
+checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32"
dependencies = [
"cc",
"glob",
@@ -1350,19 +1338,22 @@ dependencies = [
"hotshot-stake-table",
"hotshot-state-prover",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-merkle-tree",
+ "jf-signature",
+ "libp2p",
"portpicker",
"rand 0.8.5",
"sequencer",
"serde",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide-disco",
"tracing",
"url",
"vbs",
+ "vec1",
]
[[package]]
@@ -1449,22 +1440,31 @@ dependencies = [
[[package]]
name = "camino"
-version = "1.1.6"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239"
dependencies = [
"serde",
]
[[package]]
name = "capnp"
-version = "0.19.3"
+version = "0.19.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b11832e6fb7a695c4a63cc42bd97bd2cda7165cd850caf5aff9a3d0e617720ed"
+checksum = "de71387912cac7dd3cb7c219e09628411620a18061bba58c71453c26ae7bf66a"
dependencies = [
"embedded-io",
]
+[[package]]
+name = "capnpc"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c75ba30e0f08582d53c2f3710cf4bb65ff562614b1ba86906d7391adffe189ec"
+dependencies = [
+ "capnp",
+]
+
[[package]]
name = "cargo-platform"
version = "0.1.8"
@@ -1482,7 +1482,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
dependencies = [
"camino",
"cargo-platform",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"thiserror",
@@ -1499,9 +1499,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.0.95"
+version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b"
+checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
dependencies = [
"jobserver",
"libc",
@@ -1511,39 +1511,19 @@ dependencies = [
[[package]]
name = "cdn-broker"
version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
-dependencies = [
- "async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
- "clap",
- "dashmap",
- "derivative",
- "jf-primitives 0.4.0-pre.0",
- "lazy_static",
- "local-ip-address",
- "parking_lot",
- "prometheus",
- "rand 0.8.5",
- "rkyv",
- "tokio",
- "tracing",
- "tracing-subscriber 0.3.18",
-]
-
-[[package]]
-name = "cdn-broker"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.3.12#7bf490b34fb5b996d7e98d3d4be6d88028a076ac"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-proto",
"clap",
+ "console-subscriber 0.3.0",
"dashmap",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"lazy_static",
"local-ip-address",
"parking_lot",
+ "portpicker",
"prometheus",
"rand 0.8.5",
"rkyv",
@@ -1555,12 +1535,12 @@ dependencies = [
[[package]]
name = "cdn-client"
version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.3.12#7bf490b34fb5b996d7e98d3d4be6d88028a076ac"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto",
"clap",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"rand 0.8.5",
"tokio",
"tracing",
@@ -1570,26 +1550,12 @@ dependencies = [
[[package]]
name = "cdn-marshal"
version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
-dependencies = [
- "async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
- "clap",
- "jf-primitives 0.4.0-pre.0",
- "tokio",
- "tracing",
- "tracing-subscriber 0.3.18",
-]
-
-[[package]]
-name = "cdn-marshal"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.3.12#7bf490b34fb5b996d7e98d3d4be6d88028a076ac"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-proto",
"clap",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"tokio",
"tracing",
"tracing-subscriber 0.3.18",
@@ -1598,62 +1564,32 @@ dependencies = [
[[package]]
name = "cdn-proto"
version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
-dependencies = [
- "anyhow",
- "ark-serialize",
- "async-trait",
- "capnp",
- "derivative",
- "jf-primitives 0.4.0-pre.0",
- "kanal",
- "lazy_static",
- "mnemonic",
- "mockall",
- "parking_lot",
- "pem 3.0.4",
- "prometheus",
- "quinn",
- "rand 0.8.5",
- "rcgen 0.12.1",
- "redis",
- "rkyv",
- "rustls 0.21.12",
- "sqlx",
- "thiserror",
- "tokio",
- "tracing",
- "url",
- "warp",
-]
-
-[[package]]
-name = "cdn-proto"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.3.12#7bf490b34fb5b996d7e98d3d4be6d88028a076ac"
dependencies = [
"anyhow",
"ark-serialize",
"async-trait",
"capnp",
+ "capnpc",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"kanal",
"lazy_static",
"mnemonic",
- "mockall",
- "parking_lot",
+ "num_enum",
"pem 3.0.4",
"prometheus",
"quinn",
"rand 0.8.5",
- "rcgen 0.12.1",
+ "rcgen 0.13.1",
"redis",
"rkyv",
- "rustls 0.21.12",
+ "rustls 0.23.10",
+ "rustls-pki-types",
"sqlx",
"thiserror",
"tokio",
+ "tokio-rustls 0.26.0",
"tracing",
"url",
"warp",
@@ -1726,9 +1662,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.4"
+version = "4.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
+checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f"
dependencies = [
"clap_builder",
"clap_derive",
@@ -1736,33 +1672,33 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.2"
+version = "4.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
+checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
- "strsim 0.11.1",
+ "strsim",
]
[[package]]
name = "clap_derive"
-version = "4.5.4"
+version = "4.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
+checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "clap_lex"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
[[package]]
name = "cld"
@@ -1851,9 +1787,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
name = "combine"
@@ -1884,7 +1820,7 @@ dependencies = [
"hex",
"serde",
"sha3",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -1925,7 +1861,20 @@ dependencies = [
"futures-core",
"prost",
"prost-types",
- "tonic",
+ "tonic 0.10.2",
+ "tracing-core",
+]
+
+[[package]]
+name = "console-api"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a257c22cd7e487dd4a13d413beabc512c5052f0bc048db0da6a84c3d8a6142fd"
+dependencies = [
+ "futures-core",
+ "prost",
+ "prost-types",
+ "tonic 0.11.0",
"tracing-core",
]
@@ -1935,7 +1884,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e"
dependencies = [
- "console-api",
+ "console-api 0.6.0",
"crossbeam-channel",
"crossbeam-utils",
"futures-task",
@@ -1947,7 +1896,32 @@ dependencies = [
"thread_local",
"tokio",
"tokio-stream",
- "tonic",
+ "tonic 0.10.2",
+ "tracing",
+ "tracing-core",
+ "tracing-subscriber 0.3.18",
+]
+
+[[package]]
+name = "console-subscriber"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c4cc54bae66f7d9188996404abdf7fdfa23034ef8e43478c8810828abad758"
+dependencies = [
+ "console-api 0.7.0",
+ "crossbeam-channel",
+ "crossbeam-utils",
+ "futures-task",
+ "hdrhistogram",
+ "humantime",
+ "prost",
+ "prost-types",
+ "serde",
+ "serde_json",
+ "thread_local",
+ "tokio",
+ "tokio-stream",
+ "tonic 0.11.0",
"tracing",
"tracing-core",
"tracing-subscriber 0.3.18",
@@ -1955,9 +1929,9 @@ dependencies = [
[[package]]
name = "const-hex"
-version = "1.11.3"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78"
+checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -1987,7 +1961,7 @@ version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"tiny-keccak",
]
@@ -2101,9 +2075,9 @@ dependencies = [
[[package]]
name = "crc-any"
-version = "2.4.4"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c01a5e1f881f6fb6099a7bdf949e946719fd4f1fefa56264890574febf0eb6d0"
+checksum = "a62ec9ff5f7965e4d7280bd5482acd20aadb50d632cf6c1d74493856b011fa73"
[[package]]
name = "crc-catalog"
@@ -2113,18 +2087,18 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]]
name = "crc32fast"
-version = "1.4.0"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.12"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
"crossbeam-utils",
]
@@ -2159,9 +2133,9 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crunchy"
@@ -2212,18 +2186,6 @@ dependencies = [
"subtle",
]
-[[package]]
-name = "crypto_kx"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "704722d1d929489c8528bb1882805700f1ba20f54325704973e786352320b1ed"
-dependencies = [
- "blake2",
- "curve25519-dalek",
- "rand_core 0.6.4",
- "serdect",
-]
-
[[package]]
name = "csv"
version = "1.3.0"
@@ -2307,16 +2269,15 @@ dependencies = [
[[package]]
name = "curve25519-dalek"
-version = "4.1.2"
+version = "4.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
dependencies = [
"cfg-if",
"cpufeatures",
"curve25519-dalek-derive",
"digest 0.10.7",
"fiat-crypto",
- "platforms",
"rustc_version 0.4.0",
"subtle",
"zeroize",
@@ -2330,7 +2291,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2372,15 +2333,15 @@ dependencies = [
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
"synstructure 0.13.1",
]
[[package]]
name = "darling"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
+checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1"
dependencies = [
"darling_core",
"darling_macro",
@@ -2388,27 +2349,27 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
+checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
- "strsim 0.10.0",
- "syn 2.0.60",
+ "strsim",
+ "syn 2.0.67",
]
[[package]]
name = "darling_macro"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
+checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2463,9 +2424,9 @@ dependencies = [
[[package]]
name = "der-parser"
-version = "8.2.0"
+version = "9.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e"
+checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553"
dependencies = [
"asn1-rs",
"displaydoc",
@@ -2504,7 +2465,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2525,7 +2486,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2535,22 +2496,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b"
dependencies = [
"derive_builder_core",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "derive_more"
-version = "0.99.17"
+version = "0.99.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
dependencies = [
"convert_case 0.4.0",
"proc-macro2",
"quote",
"rustc_version 0.4.0",
- "syn 1.0.109",
+ "syn 2.0.67",
]
+[[package]]
+name = "diff"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
+
[[package]]
name = "diff-test-bn254"
version = "0.1.0"
@@ -2585,10 +2552,11 @@ dependencies = [
"hotshot-state-prover",
"hotshot-types",
"itertools 0.12.1",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-relation",
+ "jf-signature",
+ "jf-utils",
"sha3",
]
@@ -2672,13 +2640,13 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
[[package]]
name = "displaydoc"
-version = "0.2.4"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2702,12 +2670,6 @@ version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
-[[package]]
-name = "downcast"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
-
[[package]]
name = "downcast-rs"
version = "1.2.1"
@@ -2784,9 +2746,9 @@ checksum = "bbbaaaf38131deb9ca518a274a45bfdb8771f139517b073b16c2d3d32ae5037b"
[[package]]
name = "either"
-version = "1.11.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
dependencies = [
"serde",
]
@@ -2818,9 +2780,9 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
[[package]]
name = "ena"
-version = "0.14.2"
+version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1"
+checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5"
dependencies = [
"log",
]
@@ -2861,7 +2823,7 @@ dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -2872,18 +2834,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "erased-serde"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
dependencies = [
"serde",
+ "typeid",
]
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -2897,6 +2860,18 @@ dependencies = [
"vbs",
]
+[[package]]
+name = "escargot"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eb5f6eeda986377996e9ed570cbc20cc16d30440696f82f129c863e4e3e83"
+dependencies = [
+ "log",
+ "once_cell",
+ "serde",
+ "serde_json",
+]
+
[[package]]
name = "espresso-macros"
version = "0.1.0"
@@ -3064,7 +3039,7 @@ dependencies = [
"reqwest 0.11.27",
"serde",
"serde_json",
- "syn 2.0.60",
+ "syn 2.0.67",
"toml",
"walkdir",
]
@@ -3082,7 +3057,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -3108,7 +3083,7 @@ dependencies = [
"serde",
"serde_json",
"strum",
- "syn 2.0.60",
+ "syn 2.0.67",
"tempfile",
"thiserror",
"tiny-keccak",
@@ -3125,7 +3100,7 @@ dependencies = [
"ethers-core",
"ethers-solc",
"reqwest 0.11.27",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"thiserror",
@@ -3234,7 +3209,7 @@ dependencies = [
"path-slash",
"rayon",
"regex",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"solang-parser",
@@ -3266,43 +3241,22 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "4.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
-dependencies = [
- "concurrent-queue",
- "parking",
- "pin-project-lite 0.2.14",
-]
-
-[[package]]
-name = "event-listener"
-version = "5.3.0"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
dependencies = [
"concurrent-queue",
"parking",
"pin-project-lite 0.2.14",
]
-[[package]]
-name = "event-listener-strategy"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
-dependencies = [
- "event-listener 4.0.3",
- "pin-project-lite 0.2.14",
-]
-
[[package]]
name = "event-listener-strategy"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
dependencies = [
- "event-listener 5.3.0",
+ "event-listener 5.3.1",
"pin-project-lite 0.2.14",
]
@@ -3349,15 +3303,9 @@ dependencies = [
[[package]]
name = "fiat-crypto"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e"
-
-[[package]]
-name = "finl_unicode"
-version = "1.2.0"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
[[package]]
name = "fixed-hash"
@@ -3387,6 +3335,16 @@ dependencies = [
"miniz_oxide",
]
+[[package]]
+name = "fluent-asserter"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62cd2a1243f15c8c9d37acc8ab4ba837e50823561cb124af8406a6f676d04341"
+dependencies = [
+ "lazy_static",
+ "num",
+]
+
[[package]]
name = "flume"
version = "0.9.2"
@@ -3440,12 +3398,6 @@ dependencies = [
"percent-encoding",
]
-[[package]]
-name = "fragile"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
-
[[package]]
name = "fs2"
version = "0.4.3"
@@ -3479,9 +3431,9 @@ dependencies = [
[[package]]
name = "futures-bounded"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e2774cc104e198ef3d3e1ff4ab40f86fa3245d6cb6a3a46174f21463cee173"
+checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e"
dependencies = [
"futures-timer",
"futures-util",
@@ -3578,7 +3530,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -3591,6 +3543,17 @@ dependencies = [
"rustls 0.21.12",
]
+[[package]]
+name = "futures-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb"
+dependencies = [
+ "futures-io",
+ "rustls 0.23.10",
+ "rustls-pki-types",
+]
+
[[package]]
name = "futures-sink"
version = "0.3.30"
@@ -3659,7 +3622,7 @@ dependencies = [
"hotshot-contract-adapter",
"hotshot-stake-table",
"hotshot-state-prover",
- "jf-primitives 0.4.4",
+ "jf-pcs",
]
[[package]]
@@ -3687,9 +3650,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"js-sys",
@@ -3774,15 +3737,15 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069"
+checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
dependencies = [
+ "atomic-waker",
"bytes 1.6.0",
"fnv",
"futures-core",
"futures-sink",
- "futures-util",
"http 1.1.0",
"indexmap 2.2.6",
"slab",
@@ -3895,6 +3858,12 @@ version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+[[package]]
+name = "hermit-abi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
+
[[package]]
name = "hex"
version = "0.4.3"
@@ -4040,8 +4009,8 @@ dependencies = [
[[package]]
name = "hotshot"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4052,9 +4021,10 @@ dependencies = [
"bimap",
"bincode",
"blake3",
- "cdn-broker 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-broker",
"cdn-client",
- "cdn-marshal 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-marshal",
+ "chrono",
"committable",
"custom_debug 0.5.1",
"dashmap",
@@ -4066,16 +4036,16 @@ dependencies = [
"hotshot-task",
"hotshot-task-impls",
"hotshot-types",
- "hotshot-web-server",
- "jf-primitives 0.4.4",
+ "jf-signature",
"libp2p-identity",
"libp2p-networking",
"lru 0.12.3",
+ "num_enum",
"portpicker",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
"time 0.3.36",
"tokio",
@@ -4086,7 +4056,7 @@ dependencies = [
[[package]]
name = "hotshot-builder-api"
version = "0.1.7"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"async-trait",
"clap",
@@ -4095,8 +4065,8 @@ dependencies = [
"futures",
"hotshot-types",
"serde",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"toml",
"vbs",
@@ -4104,9 +4074,10 @@ dependencies = [
[[package]]
name = "hotshot-builder-core"
-version = "0.1.14"
-source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.14#2e873a3775a9f412bb084afef25e419e8ecd1773"
+version = "0.1.26"
+source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=rc-0.1.29#2f5d1b7bb17bb667cf34df804b95a2816aea6dd2"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-lock 2.8.0",
@@ -4114,6 +4085,7 @@ dependencies = [
"async-trait",
"clap",
"committable",
+ "derivative",
"futures",
"hotshot",
"hotshot-builder-api",
@@ -4121,10 +4093,11 @@ dependencies = [
"hotshot-types",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide-disco",
+ "tokio",
"tracing",
"vbs",
]
@@ -4145,17 +4118,17 @@ dependencies = [
"diff-test-bn254",
"ethers",
"hotshot-types",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-utils",
"num-bigint",
"num-traits",
]
[[package]]
name = "hotshot-events-service"
-version = "0.1.15"
-source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.16#dc8d019f7f487ad2bbb87cc934498d0abfc4af13"
+version = "0.1.27"
+source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=rc-0.1.29#0aa74a42b4bae9dc11011684e7a10346590fa068"
dependencies = [
"async-broadcast",
"async-compatibility-layer",
@@ -4169,8 +4142,8 @@ dependencies = [
"futures",
"hotshot-types",
"serde",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"toml",
"tracing",
@@ -4179,8 +4152,8 @@ dependencies = [
[[package]]
name = "hotshot-example-types"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4201,27 +4174,28 @@ dependencies = [
"serde",
"sha2 0.10.8",
"sha3",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"time 0.3.36",
"tokio",
"tracing",
+ "vbs",
]
[[package]]
name = "hotshot-macros"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"derive_builder",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "hotshot-orchestrator"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"async-compatibility-layer",
@@ -4245,24 +4219,24 @@ dependencies = [
"toml",
"tracing",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-query-service"
-version = "0.1.14"
-source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.14#4a10a39e34888afd8b56705bf0991a391a7d35c9"
+version = "0.1.39"
+source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=rc-0.1.41#bd03a5d909e8705f6038f2066a7633732c653219"
dependencies = [
"anyhow",
"ark-serialize",
"async-compatibility-layer",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"atomic_store",
"bincode",
"bit-vec",
"chrono",
- "clap",
- "cld",
"committable",
"custom_debug 0.6.1",
"derivative",
@@ -4276,7 +4250,8 @@ dependencies = [
"hotshot-types",
"include_dir",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
+ "jf-merkle-tree",
+ "jf-vid",
"native-tls",
"portpicker",
"postgres-native-tls",
@@ -4285,10 +4260,10 @@ dependencies = [
"refinery",
"serde",
"serde_json",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"spin_sleep",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tempfile",
"tide-disco",
"time 0.3.36",
@@ -4299,12 +4274,13 @@ dependencies = [
"trait-variant",
"typenum",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-stake-table"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"ark-bn254",
"ark-ed-on-bn254",
@@ -4314,10 +4290,12 @@ dependencies = [
"digest 0.10.7",
"ethereum-types",
"hotshot-types",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
"serde",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -4349,16 +4327,20 @@ dependencies = [
"hotshot-stake-table",
"hotshot-types",
"itertools 0.12.1",
+ "jf-crhf",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-relation",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
"rand_chacha 0.3.1",
+ "reqwest 0.12.5",
"sequencer-utils",
"serde",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.3.4",
+ "tagged-base64",
"tide-disco",
"time 0.3.36",
"toml",
@@ -4369,12 +4351,14 @@ dependencies = [
[[package]]
name = "hotshot-task"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-std",
+ "async-trait",
"futures",
"tokio",
"tracing",
@@ -4382,8 +4366,8 @@ dependencies = [
[[package]]
name = "hotshot-task-impls"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4393,6 +4377,7 @@ dependencies = [
"async-trait",
"bincode",
"bitvec",
+ "cdn-proto",
"chrono",
"committable",
"either",
@@ -4400,13 +4385,14 @@ dependencies = [
"hotshot-builder-api",
"hotshot-task",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-signature",
+ "jf-vid",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"time 0.3.36",
"tokio",
"tracing",
@@ -4415,9 +4401,10 @@ dependencies = [
[[package]]
name = "hotshot-testing"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-lock 2.8.0",
@@ -4437,25 +4424,27 @@ dependencies = [
"hotshot-task",
"hotshot-task-impls",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-signature",
+ "jf-vid",
"lru 0.12.3",
"portpicker",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
"sha3",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"tokio",
"tracing",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-types"
version = "0.1.11"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"ark-bls12-381",
@@ -4473,7 +4462,7 @@ dependencies = [
"bincode",
"bitvec",
"blake3",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto",
"committable",
"custom_debug 0.5.1",
"derivative",
@@ -4485,42 +4474,25 @@ dependencies = [
"ethereum-types",
"futures",
"generic-array",
- "jf-plonk",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-pcs",
+ "jf-signature",
+ "jf-utils",
+ "jf-vid",
"lazy_static",
"memoize",
"rand 0.8.5",
"rand_chacha 0.3.1",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"time 0.3.36",
"tokio",
"tracing",
"typenum",
"url",
"vbs",
-]
-
-[[package]]
-name = "hotshot-web-server"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
-dependencies = [
- "async-compatibility-layer",
- "async-lock 2.8.0",
- "async-std",
- "clap",
- "futures",
- "hotshot-types",
- "rand 0.8.5",
- "tide-disco",
- "tokio",
- "toml",
- "tracing",
- "vbs",
+ "vec1",
]
[[package]]
@@ -4568,12 +4540,12 @@ dependencies = [
[[package]]
name = "http-body-util"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
dependencies = [
"bytes 1.6.0",
- "futures-core",
+ "futures-util",
"http 1.1.0",
"http-body 1.0.0",
"pin-project-lite 0.2.14",
@@ -4617,9 +4589,9 @@ dependencies = [
[[package]]
name = "httparse"
-version = "1.8.0"
+version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
[[package]]
name = "httpdate"
@@ -4635,9 +4607,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
-version = "0.14.28"
+version = "0.14.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
dependencies = [
"bytes 1.6.0",
"futures-channel",
@@ -4666,7 +4638,7 @@ dependencies = [
"bytes 1.6.0",
"futures-channel",
"futures-util",
- "h2 0.4.4",
+ "h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"httparse",
@@ -4685,10 +4657,27 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
dependencies = [
"futures-util",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"rustls 0.21.12",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
+dependencies = [
+ "futures-util",
+ "http 1.1.0",
+ "hyper 1.3.1",
+ "hyper-util",
+ "rustls 0.23.10",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls 0.26.0",
+ "tower-service",
]
[[package]]
@@ -4697,7 +4686,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "hyper 0.14.28",
+ "hyper 0.14.29",
"pin-project-lite 0.2.14",
"tokio",
"tokio-io-timeout",
@@ -4721,9 +4710,9 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.3"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56"
dependencies = [
"bytes 1.6.0",
"futures-channel",
@@ -4750,7 +4739,7 @@ dependencies = [
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows-core",
+ "windows-core 0.52.0",
]
[[package]]
@@ -4804,7 +4793,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e"
dependencies = [
- "async-io 2.3.2",
+ "async-io 2.3.3",
"core-foundation",
"fnv",
"futures",
@@ -4829,7 +4818,7 @@ dependencies = [
"bytes 1.6.0",
"futures",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"log",
"rand 0.8.5",
"tokio",
@@ -4877,18 +4866,18 @@ dependencies = [
[[package]]
name = "include_dir"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e"
+checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd"
dependencies = [
"include_dir_macros",
]
[[package]]
name = "include_dir_macros"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f"
+checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75"
dependencies = [
"proc-macro2",
"quote",
@@ -4948,9 +4937,9 @@ dependencies = [
[[package]]
name = "instant"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
"cfg-if",
]
@@ -4961,7 +4950,7 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
"libc",
"windows-sys 0.48.0",
]
@@ -4984,6 +4973,12 @@ version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+
[[package]]
name = "isahc"
version = "0.9.14"
@@ -5050,126 +5045,111 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
-name = "jf-plonk"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-commitment"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-std",
+]
+
+[[package]]
+name = "jf-crhf"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-serialize",
+ "ark-std",
+]
+
+[[package]]
+name = "jf-merkle-tree"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
+ "ark-bls12-377",
+ "ark-bls12-381",
+ "ark-bn254",
"ark-ec",
"ark-ff",
- "ark-poly",
"ark-serialize",
"ark-std",
"derivative",
+ "digest 0.10.7",
"displaydoc",
- "downcast-rs",
- "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "espresso-systems-common 0.4.0",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
- "merlin",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"num-bigint",
- "rand_chacha 0.3.1",
- "rayon",
+ "num-traits",
"serde",
"sha3",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
-name = "jf-primitives"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+name = "jf-pcs"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
- "anyhow",
- "ark-bls12-377",
- "ark-bls12-381",
- "ark-bn254",
- "ark-bw6-761",
- "ark-crypto-primitives",
"ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ed-on-bls12-381",
- "ark-ed-on-bn254",
"ark-ff",
- "ark-pallas",
"ark-poly",
"ark-serialize",
"ark-std",
- "blst",
- "chacha20poly1305",
- "crypto_kx",
"derivative",
- "digest 0.10.7",
"displaydoc",
- "espresso-systems-common 0.4.0",
- "generic-array",
- "hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-relation 0.4.0-pre.0",
- "jf-utils 0.4.0-pre.0",
+ "jf-utils",
"merlin",
- "num-bigint",
- "num-traits",
- "rand_chacha 0.3.1",
- "serde",
- "sha2 0.10.8",
- "sha3",
- "tagged-base64 0.3.4",
- "typenum",
- "zeroize",
+ "rayon",
]
[[package]]
-name = "jf-primitives"
+name = "jf-plonk"
version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
- "anyhow",
- "ark-bls12-377",
- "ark-bls12-381",
- "ark-bn254",
- "ark-bw6-761",
- "ark-crypto-primitives",
"ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ed-on-bls12-381",
- "ark-ed-on-bn254",
"ark-ff",
- "ark-pallas",
"ark-poly",
"ark-serialize",
"ark-std",
- "blst",
- "chacha20poly1305",
- "crypto_kx",
"derivative",
- "digest 0.10.7",
"displaydoc",
+ "downcast-rs",
+ "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"espresso-systems-common 0.4.0",
- "generic-array",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-pcs",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"merlin",
"num-bigint",
- "num-traits",
"rand_chacha 0.3.1",
"rayon",
"serde",
- "sha2 0.10.8",
"sha3",
- "tagged-base64 0.4.0",
- "zeroize",
+ "tagged-base64",
+]
+
+[[package]]
+name = "jf-prf"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-serialize",
+ "ark-std",
]
[[package]]
name = "jf-relation"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+version = "0.4.4"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-bls12-377",
"ark-bls12-381",
@@ -5186,66 +5166,108 @@ dependencies = [
"dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-utils 0.4.0-pre.0",
+ "jf-utils",
"num-bigint",
"rand_chacha 0.3.1",
+ "rayon",
]
[[package]]
-name = "jf-relation"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-rescue"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-bls12-377",
"ark-bls12-381",
"ark-bn254",
"ark-bw6-761",
+ "ark-crypto-primitives",
+ "ark-ed-on-bls12-377",
+ "ark-ed-on-bls12-381",
+ "ark-ed-on-bn254",
+ "ark-ff",
+ "ark-std",
+ "displaydoc",
+ "itertools 0.12.1",
+ "jf-commitment",
+ "jf-crhf",
+ "jf-prf",
+ "jf-relation",
+ "jf-utils",
+]
+
+[[package]]
+name = "jf-signature"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-bls12-381",
+ "ark-bn254",
"ark-ec",
"ark-ff",
- "ark-poly",
"ark-serialize",
"ark-std",
+ "blst",
"derivative",
+ "digest 0.10.7",
"displaydoc",
- "downcast-rs",
- "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"num-bigint",
- "rand_chacha 0.3.1",
- "rayon",
+ "num-traits",
+ "serde",
+ "sha3",
+ "tagged-base64",
+ "zeroize",
]
[[package]]
name = "jf-utils"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+version = "0.4.4"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-ec",
+ "ark-ed-on-bls12-377",
+ "ark-ed-on-bls12-381",
"ark-ff",
+ "ark-poly",
"ark-serialize",
"ark-std",
"digest 0.10.7",
+ "displaydoc",
+ "rand_chacha 0.3.1",
+ "rayon",
"serde",
"sha2 0.10.8",
- "tagged-base64 0.3.4",
+ "tagged-base64",
]
[[package]]
-name = "jf-utils"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-vid"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
+ "anyhow",
"ark-ec",
"ark-ff",
+ "ark-poly",
"ark-serialize",
"ark-std",
+ "derivative",
"digest 0.10.7",
+ "displaydoc",
+ "generic-array",
+ "itertools 0.12.1",
+ "jf-merkle-tree",
+ "jf-pcs",
+ "jf-utils",
"rayon",
"serde",
- "sha2 0.10.8",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -5346,7 +5368,7 @@ dependencies = [
"lalrpop-util",
"petgraph",
"regex",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
"string_cache",
"term",
"tiny-keccak",
@@ -5360,7 +5382,7 @@ version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553"
dependencies = [
- "regex-automata 0.4.6",
+ "regex-automata 0.4.7",
]
[[package]]
@@ -5374,9 +5396,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.153"
+version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
name = "libm"
@@ -5404,7 +5426,7 @@ dependencies = [
"either",
"futures",
"futures-timer",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"instant",
"libp2p-allow-block-list",
"libp2p-autonat",
@@ -5565,7 +5587,7 @@ dependencies = [
"fnv",
"futures",
"futures-ticker",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"hex_fmt",
"instant",
"libp2p-core",
@@ -5585,9 +5607,9 @@ dependencies = [
[[package]]
name = "libp2p-identify"
-version = "0.44.1"
+version = "0.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20499a945d2f0221fdc6269b3848892c0f370d2ee3e19c7f65a29d8f860f6126"
+checksum = "b5d635ebea5ca0c3c3e77d414ae9b67eccf2a822be06091b9c1a0d13029a1e2f"
dependencies = [
"asynchronous-codec 0.7.0",
"either",
@@ -5608,9 +5630,9 @@ dependencies = [
[[package]]
name = "libp2p-identity"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "999ec70441b2fb35355076726a6bc466c932e9bdc66f6a11c6c0aa17c7ab9be0"
+checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8"
dependencies = [
"asn1_der",
"bs58",
@@ -5663,7 +5685,7 @@ version = "0.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49007d9a339b3e1d7eeebc4d67c05dbf23d300b7d091193ec2d3f26802d7faf2"
dependencies = [
- "async-io 2.3.2",
+ "async-io 2.3.3",
"async-std",
"data-encoding",
"futures",
@@ -5702,14 +5724,15 @@ dependencies = [
[[package]]
name = "libp2p-networking"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.58"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.59#b9329c30b25dcbda5018a36ee06ee4294111778f"
dependencies = [
"anyhow",
"async-compatibility-layer",
"async-lock 2.8.0",
"async-std",
"async-trait",
+ "bincode",
"blake3",
"custom_debug 0.5.1",
"derive_builder",
@@ -5724,11 +5747,10 @@ dependencies = [
"serde",
"serde_bytes",
"serde_json",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"tokio",
"tokio-stream",
"tracing",
- "vbs",
"void",
]
@@ -5760,9 +5782,9 @@ dependencies = [
[[package]]
name = "libp2p-ping"
-version = "0.44.0"
+version = "0.44.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76b94ee41bd8c294194fe608851e45eb98de26fe79bc7913838cbffbfe8c7ce2"
+checksum = "a1de5a6cf64fba7f7e8f2102711c9c6c043a8e56b86db8cd306492c517da3fb3"
dependencies = [
"either",
"futures",
@@ -5808,9 +5830,9 @@ dependencies = [
[[package]]
name = "libp2p-quic"
-version = "0.10.2"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0375cdfee57b47b313ef1f0fdb625b78aed770d33a40cf1c294a371ff5e6666"
+checksum = "c67296ad4e092e23f92aea3d2bdb6f24eab79c0929ed816dfb460ea2f4567d2b"
dependencies = [
"async-std",
"bytes 1.6.0",
@@ -5823,8 +5845,8 @@ dependencies = [
"parking_lot",
"quinn",
"rand 0.8.5",
- "ring 0.16.20",
- "rustls 0.21.12",
+ "ring 0.17.8",
+ "rustls 0.23.10",
"socket2 0.5.7",
"thiserror",
"tokio",
@@ -5833,9 +5855,9 @@ dependencies = [
[[package]]
name = "libp2p-relay"
-version = "0.17.1"
+version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0aadb213ffc8e1a6f2b9c48dcf0fc07bf370f2ea4db7981813d45e50671c8d9d"
+checksum = "4d1c667cfabf3dd675c8e3cea63b7b98434ecf51721b7894cbb01d29983a6a9b"
dependencies = [
"asynchronous-codec 0.7.0",
"bytes 1.6.0",
@@ -5843,7 +5865,6 @@ dependencies = [
"futures",
"futures-bounded",
"futures-timer",
- "instant",
"libp2p-core",
"libp2p-identity",
"libp2p-swarm",
@@ -5854,6 +5875,7 @@ dependencies = [
"thiserror",
"tracing",
"void",
+ "web-time",
]
[[package]]
@@ -5882,9 +5904,9 @@ dependencies = [
[[package]]
name = "libp2p-request-response"
-version = "0.26.1"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e12823250fe0c45bdddea6eefa2be9a609aff1283ff4e1d8a294fdbb89572f6f"
+checksum = "c314fe28368da5e3a262553fb0ad575c1c8934c461e10de10265551478163836"
dependencies = [
"async-trait",
"cbor4ii",
@@ -5904,9 +5926,9 @@ dependencies = [
[[package]]
name = "libp2p-swarm"
-version = "0.44.1"
+version = "0.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e92532fc3c4fb292ae30c371815c9b10103718777726ea5497abc268a4761866"
+checksum = "80cae6cb75f89dbca53862f9ebe0b9f463aa7b302762fcfaafb9e51dcc9b0f7e"
dependencies = [
"async-std",
"either",
@@ -5917,6 +5939,7 @@ dependencies = [
"libp2p-core",
"libp2p-identity",
"libp2p-swarm-derive",
+ "lru 0.12.3",
"multistream-select",
"once_cell",
"rand 0.8.5",
@@ -5928,14 +5951,14 @@ dependencies = [
[[package]]
name = "libp2p-swarm-derive"
-version = "0.34.1"
+version = "0.34.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b644268b4acfdaa6a6100b31226ee7a36d96ab4c43287d113bfd2308607d8b6f"
+checksum = "5daceb9dd908417b6dfcfe8e94098bc4aac54500c282e78120b885dadc09b999"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -5958,17 +5981,17 @@ dependencies = [
[[package]]
name = "libp2p-tls"
-version = "0.3.0"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ce7e3c2e7569d685d08ec795157981722ff96e9e9f9eae75df3c29d02b07a5"
+checksum = "251b17aebdd29df7e8f80e4d94b782fae42e934c49086e1a81ba23b60a8314f2"
dependencies = [
"futures",
- "futures-rustls",
+ "futures-rustls 0.26.0",
"libp2p-core",
"libp2p-identity",
"rcgen 0.11.3",
- "ring 0.16.20",
- "rustls 0.21.12",
+ "ring 0.17.8",
+ "rustls 0.23.10",
"rustls-webpki 0.101.7",
"thiserror",
"x509-parser",
@@ -5988,9 +6011,9 @@ dependencies = [
[[package]]
name = "libp2p-upnp"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b49cc89949bf0e06869297cd4fe2c132358c23fe93e76ad43950453df4da3d35"
+checksum = "cccf04b0e3ff3de52d07d5fd6c3b061d0e7f908ffc683c32d9638caedce86fc8"
dependencies = [
"futures",
"futures-timer",
@@ -6010,7 +6033,7 @@ checksum = "f4846d51afd08180e164291c3754ba30dd4fbac6fac65571be56403c16431a5e"
dependencies = [
"either",
"futures",
- "futures-rustls",
+ "futures-rustls 0.24.0",
"libp2p-core",
"libp2p-identity",
"parking_lot",
@@ -6034,7 +6057,7 @@ dependencies = [
"thiserror",
"tracing",
"yamux 0.12.1",
- "yamux 0.13.1",
+ "yamux 0.13.3",
]
[[package]]
@@ -6108,9 +6131,9 @@ dependencies = [
[[package]]
name = "libz-sys"
-version = "1.1.16"
+version = "1.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
+checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e"
dependencies = [
"cc",
"libc",
@@ -6132,9 +6155,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "local-ip-address"
@@ -6246,7 +6269,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -6261,9 +6284,9 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.2"
+version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "memoize"
@@ -6324,9 +6347,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
@@ -6348,33 +6371,6 @@ version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b8f3a258db515d5e91a904ce4ae3f73e091149b90cadbdb93d210bee07f63b"
-[[package]]
-name = "mockall"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"
-dependencies = [
- "cfg-if",
- "downcast",
- "fragile",
- "lazy_static",
- "mockall_derive",
- "predicates",
- "predicates-tree",
-]
-
-[[package]]
-name = "mockall_derive"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2"
-dependencies = [
- "cfg-if",
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
-
[[package]]
name = "multiaddr"
version = "0.18.1"
@@ -6436,16 +6432,15 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
name = "native-tls"
-version = "0.2.11"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
dependencies = [
- "lazy_static",
"libc",
"log",
"openssl",
@@ -6592,13 +6587,26 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "num"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
+dependencies = [
+ "num-bigint",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
[[package]]
name = "num-bigint"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
dependencies = [
- "autocfg",
"num-integer",
"num-traits",
]
@@ -6621,21 +6629,19 @@ dependencies = [
]
[[package]]
-name = "num-conv"
-version = "0.1.0"
+name = "num-complex"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+dependencies = [
+ "num-traits",
+]
[[package]]
-name = "num-derive"
-version = "0.4.2"
+name = "num-conv"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-integer"
@@ -6648,20 +6654,31 @@ dependencies = [
[[package]]
name = "num-iter"
-version = "0.1.44"
+version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
+[[package]]
+name = "num-rational"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+dependencies = [
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
[[package]]
name = "num-traits"
-version = "0.2.18"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
"libm",
@@ -6673,7 +6690,7 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
"libc",
]
@@ -6692,10 +6709,19 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+dependencies = [
+ "libc",
]
[[package]]
@@ -6709,9 +6735,9 @@ dependencies = [
[[package]]
name = "oid-registry"
-version = "0.6.1"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff"
+checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d"
dependencies = [
"asn1-rs",
]
@@ -6776,7 +6802,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -6827,9 +6853,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
[[package]]
name = "parity-scale-codec"
-version = "3.6.9"
+version = "3.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe"
+checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee"
dependencies = [
"arrayvec",
"bitvec",
@@ -6841,11 +6867,11 @@ dependencies = [
[[package]]
name = "parity-scale-codec-derive"
-version = "3.6.9"
+version = "3.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b"
+checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c"
dependencies = [
- "proc-macro-crate 2.0.0",
+ "proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
@@ -6859,9 +6885,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
[[package]]
name = "parking_lot"
-version = "0.12.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -6875,7 +6901,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.5.1",
+ "redox_syscall 0.5.2",
"smallvec",
"windows-targets 0.52.5",
]
@@ -6893,9 +6919,9 @@ dependencies = [
[[package]]
name = "paste"
-version = "1.0.14"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "path-slash"
@@ -6946,7 +6972,7 @@ version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"serde",
]
@@ -6967,9 +6993,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
-version = "2.7.9"
+version = "2.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95"
+checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8"
dependencies = [
"memchr",
"thiserror",
@@ -6978,9 +7004,9 @@ dependencies = [
[[package]]
name = "pest_derive"
-version = "2.7.9"
+version = "2.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f73541b156d32197eecda1a4014d7f868fd2bcb3c550d5386087cfba442bf69c"
+checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459"
dependencies = [
"pest",
"pest_generator",
@@ -6988,22 +7014,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.7.9"
+version = "2.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c35eeed0a3fab112f75165fdc026b3913f4183133f19b49be773ac9ea966e8bd"
+checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "pest_meta"
-version = "2.7.9"
+version = "2.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2adbf29bb9776f28caece835398781ab24435585fe0d4dc1374a61db5accedca"
+checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd"
dependencies = [
"once_cell",
"pest",
@@ -7012,9 +7038,9 @@ dependencies = [
[[package]]
name = "petgraph"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [
"fixedbitset",
"indexmap 2.2.6",
@@ -7060,7 +7086,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -7098,7 +7124,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -7127,9 +7153,9 @@ checksum = "d15b6607fa632996eb8a17c9041cb6071cb75ac057abd45dece578723ea8c7c0"
[[package]]
name = "piper"
-version = "0.2.1"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
+checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
dependencies = [
"atomic-waker",
"fastrand 2.1.0",
@@ -7163,12 +7189,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-[[package]]
-name = "platforms"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7"
-
[[package]]
name = "polling"
version = "2.8.0"
@@ -7187,13 +7207,13 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.7.0"
+version = "3.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3"
+checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
dependencies = [
"cfg-if",
"concurrent-queue",
- "hermit-abi",
+ "hermit-abi 0.4.0",
"pin-project-lite 0.2.14",
"rustix 0.38.34",
"tracing",
@@ -7308,39 +7328,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
-name = "predicates"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8"
-dependencies = [
- "anstyle",
- "predicates-core",
-]
-
-[[package]]
-name = "predicates-core"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
-
-[[package]]
-name = "predicates-tree"
-version = "1.0.9"
+name = "pretty_assertions"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
- "predicates-core",
- "termtree",
+ "diff",
+ "yansi",
]
[[package]]
name = "prettyplease"
-version = "0.2.19"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550"
+checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [
"proc-macro2",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -7349,31 +7353,12 @@ version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2"
dependencies = [
- "fixed-hash",
- "impl-codec",
- "impl-rlp",
- "impl-serde",
- "scale-info",
- "uint",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
-dependencies = [
- "once_cell",
- "toml_edit 0.19.15",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
-dependencies = [
- "toml_edit 0.20.7",
+ "fixed-hash",
+ "impl-codec",
+ "impl-rlp",
+ "impl-serde",
+ "scale-info",
+ "uint",
]
[[package]]
@@ -7416,18 +7401,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.81"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [
"unicode-ident",
]
[[package]]
name = "prometheus"
-version = "0.13.3"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c"
+checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1"
dependencies = [
"cfg-if",
"fnv",
@@ -7458,7 +7443,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -7473,15 +7458,15 @@ dependencies = [
"rand 0.8.5",
"rand_chacha 0.3.1",
"rand_xorshift",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
"unarray",
]
[[package]]
name = "prost"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922"
+checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
dependencies = [
"bytes 1.6.0",
"prost-derive",
@@ -7489,22 +7474,22 @@ dependencies = [
[[package]]
name = "prost-derive"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48"
+checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "prost-types"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe"
+checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
dependencies = [
"prost",
]
@@ -7578,11 +7563,11 @@ dependencies = [
[[package]]
name = "quinn"
-version = "0.10.2"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75"
+checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad"
dependencies = [
- "async-io 1.13.0",
+ "async-io 2.3.3",
"async-std",
"bytes 1.6.0",
"futures-io",
@@ -7590,7 +7575,7 @@ dependencies = [
"quinn-proto",
"quinn-udp",
"rustc-hash",
- "rustls 0.21.12",
+ "rustls 0.23.10",
"thiserror",
"tokio",
"tracing",
@@ -7598,15 +7583,15 @@ dependencies = [
[[package]]
name = "quinn-proto"
-version = "0.10.6"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a"
+checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe"
dependencies = [
"bytes 1.6.0",
"rand 0.8.5",
- "ring 0.16.20",
+ "ring 0.17.8",
"rustc-hash",
- "rustls 0.21.12",
+ "rustls 0.23.10",
"slab",
"thiserror",
"tinyvec",
@@ -7615,15 +7600,15 @@ dependencies = [
[[package]]
name = "quinn-udp"
-version = "0.4.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7"
+checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46"
dependencies = [
- "bytes 1.6.0",
"libc",
+ "once_cell",
"socket2 0.5.7",
"tracing",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -7700,7 +7685,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
@@ -7765,12 +7750,13 @@ dependencies = [
[[package]]
name = "rcgen"
-version = "0.12.1"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48406db8ac1f3cbc7dcdb56ec355343817958a356ff430259bb07baf7607e1e1"
+checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779"
dependencies = [
"pem 3.0.4",
"ring 0.17.8",
+ "rustls-pki-types",
"time 0.3.36",
"x509-parser",
"yasna",
@@ -7778,9 +7764,9 @@ dependencies = [
[[package]]
name = "redis"
-version = "0.24.0"
+version = "0.25.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd"
+checksum = "e0d7a6955c7511f60f3ba9e86c6d02b3c3f144f8c24b288d1f4e18074ab8bbec"
dependencies = [
"arc-swap",
"async-trait",
@@ -7809,9 +7795,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
+checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
dependencies = [
"bitflags 2.5.0",
]
@@ -7822,7 +7808,7 @@ version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libredox",
"thiserror",
]
@@ -7869,19 +7855,19 @@ dependencies = [
"quote",
"refinery-core",
"regex",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "regex"
-version = "1.10.4"
+version = "1.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.4.6",
- "regex-syntax 0.8.3",
+ "regex-automata 0.4.7",
+ "regex-syntax 0.8.4",
]
[[package]]
@@ -7895,13 +7881,13 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
]
[[package]]
@@ -7912,9 +7898,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "rend"
@@ -7939,8 +7925,8 @@ dependencies = [
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
- "hyper-rustls",
+ "hyper 0.14.29",
+ "hyper-rustls 0.24.2",
"ipnet",
"js-sys",
"log",
@@ -7953,10 +7939,10 @@ dependencies = [
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 0.1.2",
"system-configuration",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
"tower-service",
"url",
"wasm-bindgen",
@@ -7968,20 +7954,21 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.4"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10"
+checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"bytes 1.6.0",
"encoding_rs",
"futures-core",
"futures-util",
- "h2 0.4.4",
+ "h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
"hyper 1.3.1",
+ "hyper-rustls 0.27.2",
"hyper-tls",
"hyper-util",
"ipnet",
@@ -7996,7 +7983,7 @@ dependencies = [
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 1.0.1",
"system-configuration",
"tokio",
"tokio-native-tls",
@@ -8051,7 +8038,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libc",
"spin 0.9.8",
"untrusted 0.9.0",
@@ -8194,9 +8181,9 @@ dependencies = [
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc-hash"
@@ -8225,7 +8212,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
- "semver 1.0.22",
+ "semver 1.0.23",
]
[[package]]
@@ -8260,7 +8247,7 @@ dependencies = [
"bitflags 2.5.0",
"errno",
"libc",
- "linux-raw-sys 0.4.13",
+ "linux-raw-sys 0.4.14",
"windows-sys 0.52.0",
]
@@ -8298,7 +8285,21 @@ dependencies = [
"log",
"ring 0.17.8",
"rustls-pki-types",
- "rustls-webpki 0.102.3",
+ "rustls-webpki 0.102.4",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "rustls"
+version = "0.23.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402"
+dependencies = [
+ "once_cell",
+ "ring 0.17.8",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.4",
"subtle",
"zeroize",
]
@@ -8318,15 +8319,15 @@ version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
-version = "1.5.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54"
+checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
[[package]]
name = "rustls-webpki"
@@ -8340,9 +8341,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.102.3"
+version = "0.102.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf"
+checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
dependencies = [
"ring 0.17.8",
"rustls-pki-types",
@@ -8351,9 +8352,9 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.15"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
[[package]]
name = "rw-stream-sink"
@@ -8368,9 +8369,9 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "salsa20"
@@ -8392,9 +8393,9 @@ dependencies = [
[[package]]
name = "scale-info"
-version = "2.11.2"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0"
+checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024"
dependencies = [
"cfg-if",
"derive_more",
@@ -8404,11 +8405,11 @@ dependencies = [
[[package]]
name = "scale-info-derive"
-version = "2.11.2"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7"
+checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62"
dependencies = [
- "proc-macro-crate 1.3.1",
+ "proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
@@ -8489,11 +8490,11 @@ dependencies = [
[[package]]
name = "security-framework"
-version = "2.10.0"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6"
+checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.5.0",
"core-foundation",
"core-foundation-sys",
"libc",
@@ -8502,9 +8503,9 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.10.0"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef"
+checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7"
dependencies = [
"core-foundation-sys",
"libc",
@@ -8521,9 +8522,9 @@ dependencies = [
[[package]]
name = "semver"
-version = "1.0.22"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
dependencies = [
"serde",
]
@@ -8561,13 +8562,13 @@ dependencies = [
"async-once-cell",
"async-std",
"async-trait",
- "base64 0.22.0",
+ "base64 0.22.1",
"base64-bytes",
"bincode",
"blake3",
"bytesize",
- "cdn-broker 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
- "cdn-marshal 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-broker",
+ "cdn-marshal",
"clap",
"cld",
"committable",
@@ -8576,11 +8577,14 @@ dependencies = [
"derive_more",
"dotenvy",
"es-version",
+ "escargot",
"espresso-macros",
"ethers",
"ethers-contract-derive",
+ "fluent-asserter",
"futures",
"hotshot",
+ "hotshot-contract-adapter",
"hotshot-events-service",
"hotshot-orchestrator",
"hotshot-query-service",
@@ -8589,26 +8593,35 @@ dependencies = [
"hotshot-task",
"hotshot-testing",
"hotshot-types",
- "hotshot-web-server",
"include_dir",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
- "lazy_static",
+ "jf-crhf",
+ "jf-merkle-tree",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
+ "jf-vid",
+ "libp2p",
"num-traits",
+ "num_enum",
+ "paste",
"portpicker",
+ "pretty_assertions",
"rand 0.8.5",
"rand_chacha 0.3.1",
"rand_distr",
+ "reqwest 0.12.5",
"sequencer-utils",
"serde",
"serde_json",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
+ "static_assertions",
"strum",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tempfile",
+ "thiserror",
"tide-disco",
"time 0.3.36",
"tokio-postgres",
@@ -8616,10 +8629,11 @@ dependencies = [
"tracing",
"tracing-subscriber 0.3.18",
"trait-set",
- "trait-variant",
"typenum",
"url",
"vbs",
+ "vec1",
+ "vergen",
"zeroize",
]
@@ -8638,6 +8652,7 @@ dependencies = [
"futures",
"hotshot-contract-adapter",
"portpicker",
+ "serde",
"serde_json",
"surf",
"tempfile",
@@ -8647,9 +8662,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.199"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
dependencies = [
"serde_derive",
]
@@ -8676,13 +8691,13 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.199"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -8696,9 +8711,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.116"
+version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
dependencies = [
"itoa",
"ryu",
@@ -8718,9 +8733,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
dependencies = [
"serde",
]
@@ -8743,7 +8758,7 @@ version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"chrono",
"hex",
"indexmap 1.9.3",
@@ -8764,17 +8779,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
-]
-
-[[package]]
-name = "serdect"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177"
-dependencies = [
- "base16ct",
- "serde",
+ "syn 2.0.67",
]
[[package]]
@@ -9015,11 +9020,11 @@ dependencies = [
[[package]]
name = "snafu"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75976f4748ab44f6e5332102be424e7c2dc18daeaf7e725f2040c3ebb133512e"
+checksum = "418b8136fec49956eba89be7da2847ec1909df92a9ae4178b5ff0ff092c8d95e"
dependencies = [
- "snafu-derive 0.8.2",
+ "snafu-derive 0.8.3",
]
[[package]]
@@ -9036,14 +9041,14 @@ dependencies = [
[[package]]
name = "snafu-derive"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4b19911debfb8c2fb1107bc6cb2d61868aaf53a988449213959bb1b5b1ed95f"
+checksum = "1a4812a669da00d17d8266a0439eddcacbc88b17f732f927e52eeb9d196f7fb5"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -9157,11 +9162,10 @@ dependencies = [
[[package]]
name = "sqlformat"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
+checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f"
dependencies = [
- "itertools 0.12.1",
"nom",
"unicode_categories",
]
@@ -9443,21 +9447,15 @@ dependencies = [
[[package]]
name = "stringprep"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6"
+checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
dependencies = [
- "finl_unicode",
"unicode-bidi",
"unicode-normalization",
+ "unicode-properties",
]
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
[[package]]
name = "strsim"
version = "0.11.1"
@@ -9475,22 +9473,22 @@ dependencies = [
[[package]]
name = "strum_macros"
-version = "0.26.2"
+version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "subtle"
-version = "2.5.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "0d0208408ba0c3df17ed26eb06992cb1a1268d41b2c0e12e65203fbe3972cee5"
[[package]]
name = "surf"
@@ -9503,7 +9501,7 @@ dependencies = [
"cfg-if",
"encoding_rs",
"futures-util",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"http-client",
"http-types",
"log",
@@ -9517,16 +9515,16 @@ dependencies = [
[[package]]
name = "surf-disco"
-version = "0.6.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b649b5919e809b105a8ae833154430f7069b0e3a392fff26a672211c6b8e30d"
+checksum = "55c871338479a1c27b5e2ae15e5ae0fe70769306d2ef5a0c2d30896a09ac8a3c"
dependencies = [
"async-std",
"async-tungstenite",
"derivative",
"futures",
"hex",
- "reqwest 0.12.4",
+ "reqwest 0.12.5",
"serde",
"serde_json",
"tide-disco",
@@ -9623,7 +9621,7 @@ dependencies = [
"hex",
"once_cell",
"reqwest 0.11.27",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"sha2 0.10.8",
@@ -9645,9 +9643,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.60"
+version = "2.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
+checksum = "ff8655ed1d86f3af4ee3fd3263786bc14245ad17c4c7e85ba7187fb3ae028c90"
dependencies = [
"proc-macro2",
"quote",
@@ -9660,6 +9658,12 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+[[package]]
+name = "sync_wrapper"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+
[[package]]
name = "synstructure"
version = "0.12.6"
@@ -9680,7 +9684,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -9704,21 +9708,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "tagged-base64"
-version = "0.3.4"
-source = "git+https://github.com/EspressoSystems/tagged-base64?tag=0.3.4#93be6f0f5c0ec8458f13dede3d2b68dcce12a608"
-dependencies = [
- "ark-serialize",
- "ark-std",
- "base64 0.21.7",
- "crc-any",
- "serde",
- "snafu 0.7.5",
- "tagged-base64-macros 0.3.3",
- "wasm-bindgen",
-]
-
[[package]]
name = "tagged-base64"
version = "0.4.0"
@@ -9727,23 +9716,14 @@ checksum = "7b74bbf1db405a3fd2c6f8cd403bfa14727faa145925efe3012fa270b61551f1"
dependencies = [
"ark-serialize",
"ark-std",
- "base64 0.22.0",
+ "base64 0.22.1",
"crc-any",
"serde",
- "snafu 0.8.2",
- "tagged-base64-macros 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64-macros",
"wasm-bindgen",
]
-[[package]]
-name = "tagged-base64-macros"
-version = "0.3.3"
-source = "git+https://github.com/EspressoSystems/tagged-base64?tag=0.3.4#93be6f0f5c0ec8458f13dede3d2b68dcce12a608"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "tagged-base64-macros"
version = "0.4.0"
@@ -9783,30 +9763,24 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "termtree"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
-
[[package]]
name = "thiserror"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -9851,11 +9825,13 @@ dependencies = [
[[package]]
name = "tide-disco"
-version = "0.6.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbf3579d6f1362fffc7d1686ed061537afe8a187fd0b18e0f5694ad17e977ff3"
+checksum = "715558234f09576333f92ee769bd160e6c4bb1d156d25613cf62be9a592f291a"
dependencies = [
"anyhow",
+ "async-h1",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"clap",
@@ -9873,23 +9849,21 @@ dependencies = [
"libc",
"markdown",
"maud",
- "num-derive",
- "num-traits",
"parking_lot",
"prometheus",
- "reqwest 0.12.4",
+ "reqwest 0.12.5",
"routefinder",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"serde_with",
"shellexpand",
"signal-hook",
"signal-hook-async-std",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"strum",
"strum_macros",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide",
"tide-websockets",
"toml",
@@ -9943,7 +9917,9 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
"deranged",
"itoa",
+ "libc",
"num-conv",
+ "num_threads",
"powerfmt",
"serde",
"time-core",
@@ -10015,9 +9991,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.37.0"
+version = "1.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
+checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
dependencies = [
"backtrace",
"bytes 1.6.0",
@@ -10045,13 +10021,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.2.0"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -10111,6 +10087,17 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "tokio-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
+dependencies = [
+ "rustls 0.23.10",
+ "rustls-pki-types",
+ "tokio",
+]
+
[[package]]
name = "tokio-stream"
version = "0.1.15"
@@ -10132,68 +10119,45 @@ dependencies = [
"log",
"rustls 0.21.12",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
"tungstenite 0.20.1",
"webpki-roots 0.25.4",
]
[[package]]
name = "tokio-util"
-version = "0.7.10"
+version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
dependencies = [
"bytes 1.6.0",
"futures-core",
"futures-sink",
"pin-project-lite 0.2.14",
"tokio",
- "tracing",
]
[[package]]
name = "toml"
-version = "0.8.12"
+version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
+checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.22.12",
+ "toml_edit 0.22.14",
]
[[package]]
name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
dependencies = [
"serde",
]
-[[package]]
-name = "toml_edit"
-version = "0.19.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.20.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
[[package]]
name = "toml_edit"
version = "0.21.1"
@@ -10207,15 +10171,15 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.22.12"
+version = "0.22.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
+checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
dependencies = [
"indexmap 2.2.6",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow 0.6.7",
+ "winnow 0.6.13",
]
[[package]]
@@ -10232,7 +10196,34 @@ dependencies = [
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.29",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "tokio",
+ "tokio-stream",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tonic"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum",
+ "base64 0.21.7",
+ "bytes 1.6.0",
+ "h2 0.3.26",
+ "http 0.2.12",
+ "http-body 0.4.6",
+ "hyper 0.14.29",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -10297,7 +10288,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -10412,7 +10403,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -10462,6 +10453,12 @@ dependencies = [
"utf-8",
]
+[[package]]
+name = "typeid"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf"
+
[[package]]
name = "typenum"
version = "1.17.0"
@@ -10522,6 +10519,12 @@ dependencies = [
"tinyvec",
]
+[[package]]
+name = "unicode-properties"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291"
+
[[package]]
name = "unicode-segmentation"
version = "1.11.0"
@@ -10594,22 +10597,22 @@ version = "2.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"flate2",
"log",
"once_cell",
"rustls 0.22.4",
"rustls-pki-types",
- "rustls-webpki 0.102.3",
+ "rustls-webpki 0.102.4",
"url",
- "webpki-roots 0.26.1",
+ "webpki-roots 0.26.3",
]
[[package]]
name = "url"
-version = "2.5.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
dependencies = [
"form_urlencoded",
"idna 0.5.0",
@@ -10631,9 +10634,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
@@ -10641,7 +10644,7 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"serde",
]
@@ -10659,9 +10662,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "value-bag"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8"
+checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101"
dependencies = [
"value-bag-serde1",
"value-bag-sval2",
@@ -10669,9 +10672,9 @@ dependencies = [
[[package]]
name = "value-bag-serde1"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc35703541cbccb5278ef7b589d79439fc808ff0b5867195a3230f9a47421d39"
+checksum = "ccacf50c5cb077a9abb723c5bcb5e0754c1a433f1e1de89edc328e2760b6328b"
dependencies = [
"erased-serde",
"serde",
@@ -10680,9 +10683,9 @@ dependencies = [
[[package]]
name = "value-bag-sval2"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "285b43c29d0b4c0e65aad24561baee67a1b69dc9be9375d4a85138cbf556f7f8"
+checksum = "1785bae486022dfb9703915d42287dcb284c1ee37bd1080eeba78cc04721285b"
dependencies = [
"sval",
"sval_buffer",
@@ -10695,9 +10698,9 @@ dependencies = [
[[package]]
name = "vbs"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "971bcbd6c41e4e53fa9eab95b2a8ddaf1826be2f3e86b4101efebc8c3a17fde0"
+checksum = "6a9d83afb293d109ae418271619046cd9d87d63ba83e473e25a5e36101edc453"
dependencies = [
"anyhow",
"bincode",
@@ -10712,6 +10715,27 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+[[package]]
+name = "vec1"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "vergen"
+version = "8.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525"
+dependencies = [
+ "anyhow",
+ "cfg-if",
+ "rustversion",
+ "time 0.3.36",
+]
+
[[package]]
name = "version_check"
version = "0.9.4"
@@ -10726,9 +10750,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
[[package]]
name = "waker-fn"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
[[package]]
name = "walkdir"
@@ -10760,7 +10784,7 @@ dependencies = [
"futures-util",
"headers",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"log",
"mime",
"mime_guess",
@@ -10817,7 +10841,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
"wasm-bindgen-shared",
]
@@ -10851,7 +10875,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -10872,6 +10896,16 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "web-time"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "webpki"
version = "0.21.4"
@@ -10899,9 +10933,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
[[package]]
name = "webpki-roots"
-version = "0.26.1"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009"
+checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
dependencies = [
"rustls-pki-types",
]
@@ -10960,7 +10994,7 @@ version = "0.51.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
dependencies = [
- "windows-core",
+ "windows-core 0.51.1",
"windows-targets 0.48.5",
]
@@ -10973,6 +11007,15 @@ dependencies = [
"windows-targets 0.48.5",
]
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.5",
+]
+
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -11123,9 +11166,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.7"
+version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578"
+checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
dependencies = [
"memchr",
]
@@ -11192,9 +11235,9 @@ dependencies = [
[[package]]
name = "x509-parser"
-version = "0.15.1"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da"
+checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69"
dependencies = [
"asn1-rs",
"data-encoding",
@@ -11202,7 +11245,7 @@ dependencies = [
"lazy_static",
"nom",
"oid-registry",
- "ring 0.16.20",
+ "ring 0.17.8",
"rusticata-macros",
"thiserror",
"time 0.3.36",
@@ -11249,18 +11292,18 @@ dependencies = [
[[package]]
name = "yamux"
-version = "0.13.1"
+version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002"
+checksum = "a31b5e376a8b012bee9c423acdbb835fc34d45001cfa3106236a624e4b738028"
dependencies = [
"futures",
- "instant",
"log",
"nohash-hasher",
"parking_lot",
"pin-project",
"rand 0.8.5",
"static_assertions",
+ "web-time",
]
[[package]]
@@ -11280,29 +11323,29 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.7.32"
+version = "0.7.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.32"
+version = "0.7.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
dependencies = [
"zeroize_derive",
]
@@ -11315,7 +11358,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.67",
]
[[package]]
@@ -11359,9 +11402,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.0.10+zstd.1.5.6"
+version = "2.0.11+zstd.1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa"
+checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4"
dependencies = [
"cc",
"pkg-config",
diff --git a/Cargo.toml b/Cargo.toml
index 2dd81d2c6..f6f47b046 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,6 +37,7 @@ async-std = { version = "1.12.0", features = ["attributes", "tokio1"] }
async-trait = "0.1"
base64 = "0.22"
base64-bytes = "0.1"
+bincode = "1.3.3"
blake3 = "1.5"
clap = { version = "4.4", features = ["derive", "env", "string"] }
cld = "0.5"
@@ -46,56 +47,77 @@ dotenvy = "0.15"
ethers = { version = "2.0", features = ["solc"] }
futures = "0.3"
+hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
# Hotshot imports
-hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.46" }
-hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.14" }
-hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.14" }
-hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
+hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "rc-0.5.59" }
+hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "rc-0.1.29" }
+hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "rc-0.1.29" }
+hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
+hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "rc-0.1.41" }
+hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" }
-hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-web-server = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.16" }
+hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
+hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
+hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.59" }
+hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" }
# Push CDN imports
cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [
"runtime-async-std",
"global-permits",
-], tag = "0.2.6", package = "cdn-broker" }
+], tag = "0.3.12", package = "cdn-broker" }
cdn-marshal = { git = "https://github.com/EspressoSystems/Push-CDN", features = [
"runtime-async-std",
"global-permits",
-], tag = "0.2.6", package = "cdn-marshal" }
+], tag = "0.3.12", package = "cdn-marshal" }
-jf-plonk = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-plonk = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"test-apis",
] }
-jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-crhf = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5" }
+jf-merkle-tree = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"std",
] }
-jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-signature = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"std",
] }
-jf-utils = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4" }
+jf-pcs = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-vid = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-rescue = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+] }
+jf-utils = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5" }
+libp2p = { version = "0.53", default-features = false }
snafu = "0.8"
strum = { version = "0.26", features = ["derive"] }
-surf-disco = "0.6"
+surf-disco = "0.8"
tagged-base64 = "0.4"
-tide-disco = "0.6"
+tide-disco = "0.8"
+thiserror = "1.0.61"
time = "0.3"
tracing = "0.1"
-trait-variant = "0.1"
bytesize = "1.3"
itertools = "0.12"
rand_chacha = "0.3"
rand_distr = "0.4"
+reqwest = "0.12"
serde = { version = "1.0.195", features = ["derive"] }
toml = "0.8"
url = "2.3"
vbs = "0.1"
+vec1 = "1.12"
+vergen = { version = "8.3", features = ["git", "gitcl"] }
zeroize = "1.7"
committable = "0.2"
portpicker = "0.1.1"
+pretty_assertions = "1.4"
diff --git a/README.md b/README.md
index 2e83826a5..1957da704 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# Espresso Sequencer
[![Build](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/build.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/build.yml)
+[![Docs](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/doc.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/doc.yml)
[![Contracts](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/contracts.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/contracts.yml)
[![Lint](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/lint.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/lint.yml)
[![Audit](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/audit.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/audit.yml)
@@ -12,10 +13,38 @@ Consisting of a data availability solution and a decentralized network of nodes
rollups can leverage the Espresso Sequencer to give developers and end users fast confirmations, low (and fair) fees,
and robust infrastructure.
-[Documentation](https://docs.espressosys.com/sequencer/espresso-sequencer-architecture/readme)
+[Official Documentation](https://docs.espressosys.com/sequencer/espresso-sequencer-architecture/readme)
+
+### Architecture
+
+This diagram below depicts a simplified view of the current architecture of the Espresso Sequencer. The diagram includes
+views of an Espresso Sequencer node, the Espresso Sequencer Network (nodes, CDN, builders, prover, state relay service),
+two rollups (one ZK rollup "Z", one optimistic rollup "O") that use the Espresso Sequencer for sequencing and some
+important L1 contracts.
+
+- Glossary
+ - Namespace: an identifier to distinguish rollups, akin to an Ethereum chain ID
+ - Rollup transaction: an transaction a user submits to a rollup, usually an EVM transaction
+ - Transaction: a transaction inside the Espresso Sequencer: a rollup transaction plus a namespace ID of the rollup
+ - Rollup block: a block in a rollup consisting only of transactions in this rollup
+ - Espresso block: a block produced by the Espresso sequencer containing transactions of multiple rollups
![Architecture diagram](./doc/architecture.svg)
+The sequence diagram below serves as a complement to the architecture diagram. The following interactions are depicted.
+
+1. Builders deposit funds into the fee contract on Ethereum Layer 1. These funds are later used to pay fees.
+2. Users submit transactions to the Submit APIs of sequencer nodes.
+3. The leader/proposer obtains a block from a builder.
+4. HotShot consensus creates new blocks containing sequenced rollup transactions.
+5. A rollup produces a rollup block with transactions sequenced by the Espresso sequencer.
+6. A proof for a HotShot state update is created and verified in the Light Client smart contract.
+7. A ZK rollup proves a correct state transaction by sending a proof to its rollup smart contract.
+8. A dispute is settled in an optimistic rollup. If necessary, the HotShot commitment is read from the Light Client
+ contract.
+
+![Sequence diagram](./doc/sequence-diagram.svg)
+
# Running the demo
Refer to [sequencer-example-l2](https://github.com/EspressoSystems/sequencer-example-l2) for instructions on how to run
@@ -28,6 +57,16 @@ a dockerized Espresso Sequencer network with an example Layer 2 rollup applicati
- Activate the environment with `nix-shell`, or `nix develop`, or `direnv allow` if using [direnv](https://direnv.net/).
- For installation without nix please see [ubuntu.md](./doc/ubuntu.md).
+## Documentation
+
+The rust code documentation can be found at
+[http://sequencer.docs.espressosys.com](http://sequencer.docs.espressosys.com). Please note the disclaimer about API
+stability at the end of the readme.
+
+To generate the documentation locally and view it in the browser, run
+
+ just doc --open
+
## Run the tests
just pull # to pull docker images
diff --git a/builder/Cargo.toml b/builder/Cargo.toml
index 4b196d8ef..ec03d40ec 100644
--- a/builder/Cargo.toml
+++ b/builder/Cargo.toml
@@ -6,6 +6,7 @@ authors = { workspace = true }
edition = { workspace = true }
[features]
+default = ["libp2p"]
libp2p = ["sequencer/libp2p"]
[dependencies]
@@ -30,7 +31,9 @@ hotshot-orchestrator = { workspace = true }
hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../hotshot-state-prover" }
hotshot-types = { workspace = true }
-jf-primitives = { workspace = true }
+jf-merkle-tree = { workspace = true }
+jf-signature = { workspace = true, features = ["bls"] }
+libp2p = { workspace = true }
portpicker = { workspace = true }
rand = "0.8.5"
sequencer = { path = "../sequencer", features = ["testing"] }
@@ -43,3 +46,7 @@ tide-disco = { workspace = true }
tracing = { workspace = true }
url = { workspace = true }
vbs = { workspace = true }
+vec1 = { workspace = true }
+
+[dev-dependencies]
+sequencer = { path = "../sequencer", features = ["testing"] }
diff --git a/builder/src/bin/permissioned-builder.rs b/builder/src/bin/permissioned-builder.rs
index f3e70cd40..53833f537 100644
--- a/builder/src/bin/permissioned-builder.rs
+++ b/builder/src/bin/permissioned-builder.rs
@@ -10,9 +10,10 @@ use hotshot_types::light_client::StateSignKey;
use hotshot_types::signature_key::BLSPrivKey;
use hotshot_types::traits::metrics::NoMetrics;
use hotshot_types::traits::node_implementation::ConsensusTime;
-use sequencer::eth_signature_key::EthKeyPair;
+use libp2p::Multiaddr;
use sequencer::persistence::no_storage::NoStorage;
-use sequencer::{BuilderParams, L1Params, NetworkParams};
+use sequencer::{eth_signature_key::EthKeyPair, Genesis};
+use sequencer::{L1Params, NetworkParams};
use snafu::Snafu;
use std::net::ToSocketAddrs;
use std::num::NonZeroUsize;
@@ -21,10 +22,6 @@ use url::Url;
#[derive(Parser, Clone, Debug)]
pub struct PermissionedBuilderOptions {
- /// Unique identifier for this instance of the sequencer network.
- #[clap(long, env = "ESPRESSO_SEQUENCER_CHAIN_ID", default_value = "0")]
- pub chain_id: u16,
-
/// URL of the HotShot orchestrator.
#[clap(
short,
@@ -46,7 +43,6 @@ pub struct PermissionedBuilderOptions {
/// The address to bind to for Libp2p (in `host:port` form)
#[clap(
- short,
long,
env = "ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS",
default_value = "0.0.0.0:1769"
@@ -56,16 +52,26 @@ pub struct PermissionedBuilderOptions {
/// The address we advertise to other nodes as being a Libp2p endpoint.
/// Should be supplied in `host:port` form.
#[clap(
- short,
long,
env = "ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS",
default_value = "localhost:1769"
)]
pub libp2p_advertise_address: String,
+ /// A comma-separated list of Libp2p multiaddresses to use as bootstrap
+ /// nodes.
+ ///
+ /// Overrides those loaded from the `HotShot` config.
+ #[clap(
+ long,
+ env = "ESPRESSO_SEQUENCER_LIBP2P_BOOTSTRAP_NODES",
+ value_delimiter = ',',
+ num_args = 1..
+ )]
+ pub libp2p_bootstrap_nodes: Option>,
+
/// URL of the Light Client State Relay Server
#[clap(
- short,
long,
env = "ESPRESSO_STATE_RELAY_SERVER_URL",
default_value = "http://localhost:8083"
@@ -83,6 +89,10 @@ pub struct PermissionedBuilderOptions {
)]
pub webserver_poll_interval: Duration,
+ /// Path to TOML file containing genesis state.
+ #[clap(long, name = "GENESIS_FILE", env = "ESPRESSO_BUILDER_GENESIS_FILE")]
+ pub genesis_file: PathBuf,
+
/// Path to file containing private keys.
///
/// The file should follow the .env format, with two keys:
@@ -99,7 +109,7 @@ pub struct PermissionedBuilderOptions {
#[clap(
long,
env = "ESPRESSO_BUILDER_PRIVATE_STAKING_KEY",
- conflicts_with = "key_file"
+ conflicts_with = "KEY_FILE"
)]
pub private_staking_key: Option,
@@ -109,7 +119,7 @@ pub struct PermissionedBuilderOptions {
#[clap(
long,
env = "ESPRESSO_BUILDER_PRIVATE_STATE_KEY",
- conflicts_with = "key_file"
+ conflicts_with = "KEY_FILE"
)]
pub private_state_key: Option,
@@ -144,9 +154,13 @@ pub struct PermissionedBuilderOptions {
#[clap(short, long, env = "ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW")]
pub view_number: u64,
- /// BUILDER CHANNEL CAPACITY
- #[clap(long, env = "ESPRESSO_BUILDER_CHANNEL_CAPACITY")]
- pub channel_capacity: NonZeroUsize,
+ /// BUILDER TRANSACTIONS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY")]
+ pub tx_channel_capacity: NonZeroUsize,
+
+ /// BUILDER HS EVENTS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY")]
+ pub event_channel_capacity: NonZeroUsize,
/// Url a sequencer can use to stream hotshot events
#[clap(long, env = "ESPRESSO_SEQUENCER_HOTSHOT_EVENTS_PROVIDER")]
@@ -164,7 +178,6 @@ pub struct PermissionedBuilderOptions {
/// The number of views to buffer before a builder garbage collects its state
#[clap(
- short,
long,
env = "ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT",
default_value = "15"
@@ -174,15 +187,6 @@ pub struct PermissionedBuilderOptions {
/// Whether or not we are a DA node.
#[clap(long, env = "ESPRESSO_SEQUENCER_IS_DA", action)]
pub is_da: bool,
-
- /// Base Fee for a block
- #[clap(
- short,
- long,
- env = "ESPRESSO_BUILDER_BLOCK_BASE_FEE",
- default_value = "0"
- )]
- base_fee: u64,
}
#[derive(Clone, Debug, Snafu)]
@@ -231,14 +235,11 @@ async fn main() -> anyhow::Result<()> {
let l1_params = L1Params {
url: opt.l1_provider_url,
+ events_max_block_range: 10000,
};
let builder_key_pair = EthKeyPair::from_mnemonic(&opt.eth_mnemonic, opt.eth_account_index)?;
- let builder_params = BuilderParams {
- prefunded_accounts: vec![],
- };
-
// Parse supplied Libp2p addresses to their socket form
// We expect all nodes to be reachable via IPv4, so we filter out any IPv6 addresses.
// Downstream in HotShot we pin the IP address to v4, but this can be fixed in the future.
@@ -259,11 +260,13 @@ async fn main() -> anyhow::Result<()> {
cdn_endpoint: opt.cdn_endpoint,
libp2p_advertise_address,
libp2p_bind_address,
+ libp2p_bootstrap_nodes: opt.libp2p_bootstrap_nodes,
orchestrator_url: opt.orchestrator_url,
state_relay_server_url: opt.state_relay_server_url,
private_staking_key: private_staking_key.clone(),
private_state_key,
state_peers: opt.state_peers,
+ catchup_backoff: Default::default(),
};
let sequencer_version = SEQUENCER_VERSION;
@@ -280,21 +283,21 @@ async fn main() -> anyhow::Result<()> {
// it will internally spawn the builder web server
let ctx = init_node(
+ Genesis::from_file(&opt.genesis_file)?,
network_params,
&NoMetrics,
- builder_params,
l1_params,
builder_server_url.clone(),
builder_key_pair,
bootstrapped_view,
- opt.channel_capacity,
+ opt.tx_channel_capacity,
+ opt.event_channel_capacity,
sequencer_version,
NoStorage,
max_api_response_timeout_duration,
buffer_view_num_count,
opt.is_da,
txn_timeout_duration,
- opt.base_fee,
)
.await?;
diff --git a/builder/src/bin/permissionless-builder.rs b/builder/src/bin/permissionless-builder.rs
index 1031461e0..35b09a8c4 100644
--- a/builder/src/bin/permissionless-builder.rs
+++ b/builder/src/bin/permissionless-builder.rs
@@ -3,13 +3,13 @@ use builder::non_permissioned::{build_instance_state, BuilderConfig};
use clap::Parser;
use cld::ClDuration;
use es_version::SEQUENCER_VERSION;
+use hotshot::traits::ValidatedState;
use hotshot_types::data::ViewNumber;
use hotshot_types::traits::node_implementation::ConsensusTime;
-use sequencer::eth_signature_key::EthKeyPair;
-use sequencer::L1Params;
+use sequencer::{eth_signature_key::EthKeyPair, Genesis, L1Params};
use snafu::Snafu;
use std::num::NonZeroUsize;
-use std::{str::FromStr, time::Duration};
+use std::{path::PathBuf, str::FromStr, time::Duration};
use url::Url;
#[derive(Parser, Clone, Debug)]
@@ -50,9 +50,17 @@ struct NonPermissionedBuilderOptions {
#[clap(short, long, env = "ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW")]
view_number: u64,
- /// BUILDER CHANNEL CAPACITY
- #[clap(short, long, env = "ESPRESSO_BUILDER_CHANNEL_CAPACITY")]
- channel_capacity: NonZeroUsize,
+ /// BUILDER TRANSACTIONS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY")]
+ pub tx_channel_capacity: NonZeroUsize,
+
+ /// BUILDER HS EVENTS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY")]
+ pub event_channel_capacity: NonZeroUsize,
+
+ /// NETWORK INITIAL NODE COUNT
+ #[clap(short, long, env = "ESPRESSO_BUILDER_INIT_NODE_COUNT")]
+ node_count: NonZeroUsize,
/// The amount of time a builder can wait before timing out a request to the API.
#[clap(
@@ -66,21 +74,15 @@ struct NonPermissionedBuilderOptions {
/// The number of views to buffer before a builder garbage collects its state
#[clap(
- short,
long,
env = "ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT",
default_value = "15"
)]
buffer_view_num_count: usize,
- /// Base Fee for a block
- #[clap(
- short,
- long,
- env = "ESPRESSO_BUILDER_BLOCK_BASE_FEE",
- default_value = "0"
- )]
- base_fee: u64,
+ /// Path to TOML file containing genesis state.
+ #[clap(long, name = "GENESIS_FILE", env = "ESPRESSO_BUILDER_GENESIS_FILE")]
+ genesis_file: PathBuf,
}
#[derive(Clone, Debug, Snafu)]
@@ -102,11 +104,13 @@ async fn main() -> anyhow::Result<()> {
setup_backtrace();
let opt = NonPermissionedBuilderOptions::parse();
+ let genesis = Genesis::from_file(&opt.genesis_file)?;
let sequencer_version = SEQUENCER_VERSION;
let l1_params = L1Params {
url: opt.l1_provider_url,
+ events_max_block_range: 10000,
};
let builder_key_pair = EthKeyPair::from_mnemonic(&opt.eth_mnemonic, opt.eth_account_index)?;
@@ -114,8 +118,15 @@ async fn main() -> anyhow::Result<()> {
let builder_server_url: Url = format!("http://0.0.0.0:{}", opt.port).parse().unwrap();
- let instance_state =
- build_instance_state(l1_params, opt.state_peers, sequencer_version).unwrap();
+ let instance_state = build_instance_state(
+ genesis.chain_config,
+ l1_params,
+ opt.state_peers,
+ sequencer_version,
+ )
+ .unwrap();
+
+ let validated_state = ValidatedState::genesis(&instance_state).0;
let api_response_timeout_duration = opt.max_api_timeout_duration;
@@ -127,14 +138,16 @@ async fn main() -> anyhow::Result<()> {
let _builder_config = BuilderConfig::init(
builder_key_pair,
bootstrapped_view,
- opt.channel_capacity,
+ opt.tx_channel_capacity,
+ opt.event_channel_capacity,
+ opt.node_count,
instance_state,
+ validated_state,
opt.hotshot_event_streaming_url,
builder_server_url,
api_response_timeout_duration,
buffer_view_num_count,
txn_timeout_duration,
- opt.base_fee,
)
.await;
diff --git a/builder/src/lib.rs b/builder/src/lib.rs
index 8d5a557fe..28714580a 100644
--- a/builder/src/lib.rs
+++ b/builder/src/lib.rs
@@ -9,10 +9,7 @@ use futures::{
stream::{Stream, StreamExt},
};
use hotshot::{
- traits::{
- election::static_committee::GeneralStaticCommittee,
- implementations::{NetworkingMetricsValue, WebServerNetwork},
- },
+ traits::election::static_committee::GeneralStaticCommittee,
types::{SignatureKey, SystemContextHandle},
HotShotInitializer, Memberships, Networks, SystemContext,
};
@@ -22,12 +19,11 @@ use hotshot_orchestrator::{
};
use hotshot_types::{
consensus::ConsensusMetricsValue,
- constants::{Version01, STATIC_VER_0_1},
+ constants::Base,
event::Event,
light_client::StateKeyPair,
signature_key::{BLSPrivKey, BLSPubKey},
- traits::election::Membership,
- traits::metrics::Metrics,
+ traits::{election::Membership, metrics::Metrics},
HotShotConfig, PeerConfig, ValidatorConfig,
};
use std::fmt::Display;
@@ -42,10 +38,8 @@ use hotshot_builder_api::builder::{
BuildError, Error as BuilderApiError, Options as HotshotBuilderApiOptions,
};
use hotshot_builder_core::service::{GlobalState, ProxyGlobalState};
-use jf_primitives::{
- merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme},
- signatures::bls_over_bn254::VerKey,
-};
+use jf_merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme};
+use jf_signature::bls_over_bn254::VerKey;
use sequencer::catchup::mock::MockStateCatchup;
use sequencer::state_signature::StakeTableCommitmentType;
use sequencer::{
@@ -57,7 +51,7 @@ use sequencer::{
state::FeeAccount,
state::ValidatedState,
state_signature::{static_stake_table_commitment, StateSigner},
- BuilderParams, L1Params, NetworkParams, Node, NodeState, PrivKey, PubKey, SeqTypes,
+ L1Params, NetworkParams, Node, NodeState, PrivKey, PubKey, SeqTypes,
};
use std::{alloc::System, any, fmt::Debug, mem};
use std::{marker::PhantomData, net::IpAddr};
@@ -69,25 +63,22 @@ pub mod non_permissioned;
pub mod permissioned;
// It runs the api service for the builder
-pub fn run_builder_api_service(url: Url, source: Arc>>) {
+pub fn run_builder_api_service(url: Url, source: ProxyGlobalState) {
// it is to serve hotshot
- let builder_api = hotshot_builder_api::builder::define_api::<
- Arc>>,
- SeqTypes,
- Version01,
- >(&HotshotBuilderApiOptions::default())
- .expect("Failed to construct the builder APIs");
+ let builder_api =
+ hotshot_builder_api::builder::define_api::, SeqTypes, Base>(
+ &HotshotBuilderApiOptions::default(),
+ )
+ .expect("Failed to construct the builder APIs");
// it enables external clients to submit txn to the builder's private mempool
- let private_mempool_api = hotshot_builder_api::builder::submit_api::<
- Arc>>,
- SeqTypes,
- Version01,
- >(&HotshotBuilderApiOptions::default())
- .expect("Failed to construct the builder API for private mempool txns");
+ let private_mempool_api =
+ hotshot_builder_api::builder::submit_api::, SeqTypes, Base>(
+ &HotshotBuilderApiOptions::default(),
+ )
+ .expect("Failed to construct the builder API for private mempool txns");
- let mut app: App>>, BuilderApiError> =
- App::with_state(source);
+ let mut app: App, BuilderApiError> = App::with_state(source);
app.register_module("block_info", builder_api)
.expect("Failed to register the builder API");
@@ -95,7 +86,7 @@ pub fn run_builder_api_service(url: Url, source: Arc,
non_staking_nodes_state_key_pairs: Vec,
non_staking_nodes_stake_entries: Vec>,
- master_map: Arc, PubKey>>,
+ master_map: Arc>,
anvil: Arc,
}
@@ -199,7 +190,7 @@ pub mod testing {
// Only pass the pub keys to the hotshot config
let known_nodes_without_stake_pub_keys = known_nodes_without_stake
.iter()
- .map(|x| ::get_public_key(&x.stake_table_entry))
+ .map(|x| ::public_key(&x.stake_table_entry))
.collect::>();
let master_map = MasterMap::new();
@@ -224,12 +215,16 @@ pub mod testing {
data_request_delay: Duration::from_millis(200),
view_sync_timeout: Duration::from_secs(5),
fixed_leader_for_gpuvid: 0,
- builder_url,
+ builder_urls: vec1::vec1![builder_url],
builder_timeout: Duration::from_secs(1),
start_threshold: (
known_nodes_with_stake.clone().len() as u64,
known_nodes_with_stake.clone().len() as u64,
),
+ start_proposing_view: 0,
+ stop_proposing_view: 0,
+ start_voting_view: 0,
+ stop_voting_view: 0,
};
Self {
@@ -265,7 +260,7 @@ pub mod testing {
.iter()
.zip(&state_key_pairs)
.map(|(pub_key, state_key_pair)| PeerConfig:: {
- stake_table_entry: pub_key.get_stake_table_entry(stake_value),
+ stake_table_entry: pub_key.stake_table_entry(stake_value),
state_ver_key: state_key_pair.ver_key(),
})
.collect::>();
@@ -326,7 +321,7 @@ pub mod testing {
bind_version: Ver,
options: impl PersistenceOptions,
) -> Vec<(
- SystemContextHandle>,
+ Arc>>,
Option>,
)> {
let num_staked_nodes = self.num_staked_nodes();
@@ -352,7 +347,7 @@ pub mod testing {
)
.await;
// wrapped in some because need to take later
- (hotshot_handle, Some(state_signer))
+ (Arc::new(hotshot_handle), Some(state_signer))
}
}))
.await
@@ -382,8 +377,7 @@ pub mod testing {
let network = Arc::new(MemoryNetwork::new(
config.my_own_validator_config.public_key,
- NetworkingMetricsValue::new(metrics),
- self.master_map.clone(),
+ &self.master_map,
None,
));
let networks = Networks {
@@ -393,8 +387,9 @@ pub mod testing {
};
let node_state = NodeState::new(
+ i as u64,
ChainConfig::default(),
- L1Client::new(self.anvil.endpoint().parse().unwrap(), Address::default()),
+ L1Client::new(self.anvil.endpoint().parse().unwrap(), 1),
MockStateCatchup::default(),
)
.with_genesis(ValidatedState::default());
@@ -439,7 +434,7 @@ pub mod testing {
let hotshot_events_api = hotshot_events_service::events::define_api::<
Arc>>,
SeqTypes,
- Version01,
+ Base,
>(&EventStreamingApiOptions::default())
.expect("Failed to define hotshot eventsAPI");
@@ -448,14 +443,14 @@ pub mod testing {
app.register_module("hotshot-events", hotshot_events_api)
.expect("Failed to register hotshot events API");
- async_spawn(app.serve(url, STATIC_VER_0_1));
+ async_spawn(app.serve(url, Base::instance()));
}
// enable hotshot event streaming
pub fn enable_hotshot_node_event_streaming(
hotshot_events_api_url: Url,
known_nodes_with_stake: Vec>,
num_non_staking_nodes: usize,
- hotshot_context_handle: SystemContextHandle>,
+ hotshot_context_handle: Arc>>,
) {
// create a event streamer
let events_streamer = Arc::new(RwLock::new(EventsStreamer::new(
@@ -469,7 +464,7 @@ pub mod testing {
// send the events to the event streaming state
async_spawn({
async move {
- let mut hotshot_event_stream = hotshot_context_handle.get_event_stream();
+ let mut hotshot_event_stream = hotshot_context_handle.event_stream();
loop {
let event = hotshot_event_stream.next().await.unwrap();
tracing::debug!("Before writing in event streamer: {event:?}");
@@ -497,12 +492,12 @@ pub mod testing {
if let Decide { leaf_chain, .. } = event.event {
if let Some(height) = leaf_chain.iter().find_map(|LeafInfo { leaf, .. }| {
if leaf
- .get_block_payload()
+ .block_payload()
.as_ref()?
- .transaction_commitments(leaf.get_block_header().metadata())
+ .transaction_commitments(leaf.block_header().metadata())
.contains(&commitment)
{
- Some(leaf.get_block_header().block_number())
+ Some(leaf.block_header().block_number())
} else {
None
}
@@ -530,10 +525,11 @@ pub mod testing {
) -> Self {
// setup the instance state
let node_state = NodeState::new(
+ u64::MAX,
ChainConfig::default(),
L1Client::new(
hotshot_test_config.get_anvil().endpoint().parse().unwrap(),
- Address::default(),
+ 1,
),
MockStateCatchup::default(),
)
@@ -544,22 +540,27 @@ pub mod testing {
let (fee_account, key_pair) = FeeAccount::generated_from_seed_indexed(seed, 2011_u64);
// channel capacity for the builder states
- let channel_capacity = NonZeroUsize::new(100).unwrap();
+ let tx_channel_capacity = NonZeroUsize::new(500).unwrap();
+ let event_channel_capacity = NonZeroUsize::new(20).unwrap();
// bootstrapping view number
// A new builder can use this view number to start building blocks from this view number
let bootstrapped_view = ViewNumber::new(0);
+ let node_count = NonZeroUsize::new(HotShotTestConfig::total_nodes()).unwrap();
+
let builder_config = BuilderConfig::init(
key_pair,
bootstrapped_view,
- channel_capacity,
+ tx_channel_capacity,
+ event_channel_capacity,
+ node_count,
node_state,
+ ValidatedState::default(),
hotshot_events_streaming_api_url,
hotshot_builder_api_url,
Duration::from_millis(2000),
15,
- Duration::from_millis(50),
- 0,
+ Duration::from_millis(500),
)
.await
.unwrap();
@@ -584,17 +585,18 @@ pub mod testing {
{
pub async fn init_permissioned_builder(
hotshot_test_config: HotShotTestConfig,
- hotshot_handle: SystemContextHandle>,
+ hotshot_handle: Arc>>,
node_id: u64,
state_signer: StateSigner,
hotshot_builder_api_url: Url,
) -> Self {
// setup the instance state
let node_state = NodeState::new(
+ node_id,
ChainConfig::default(),
L1Client::new(
hotshot_test_config.get_anvil().endpoint().parse().unwrap(),
- Address::default(),
+ 1,
),
MockStateCatchup::default(),
)
@@ -605,24 +607,26 @@ pub mod testing {
let (fee_account, key_pair) = FeeAccount::generated_from_seed_indexed(seed, 2011_u64);
// channel capacity for the builder states
- let channel_capacity = NonZeroUsize::new(100).unwrap();
+ let tx_channel_capacity = NonZeroUsize::new(20).unwrap();
+ let event_channel_capacity = NonZeroUsize::new(500).unwrap();
// bootstrapping view number
// A new builder can use this view number to start building blocks from this view number
let bootstrapped_view = ViewNumber::new(0);
let builder_context = BuilderContext::init(
- hotshot_handle,
+ Arc::clone(&hotshot_handle),
state_signer,
node_id,
key_pair,
bootstrapped_view,
- channel_capacity,
+ tx_channel_capacity,
+ event_channel_capacity,
node_state,
+ ValidatedState::default(),
hotshot_builder_api_url,
Duration::from_millis(2000),
15,
- Duration::from_millis(50),
- 0,
+ Duration::from_millis(500),
)
.await
.unwrap();
@@ -664,10 +668,10 @@ mod test {
use hotshot_builder_core::service::GlobalState;
use hotshot_types::event::LeafInfo;
use hotshot_types::traits::block_contents::{
- vid_commitment, BlockHeader, BlockPayload, GENESIS_VID_NUM_STORAGE_NODES,
+ vid_commitment, BlockHeader, BlockPayload, EncodeBytes, GENESIS_VID_NUM_STORAGE_NODES,
};
use hotshot_types::utils::BuilderCommitment;
- use sequencer::block::payload::Payload;
+ use sequencer::block::Payload;
use sequencer::persistence::no_storage::{self, NoStorage};
use sequencer::persistence::sql;
use sequencer::{empty_builder_commitment, Header};
@@ -695,23 +699,23 @@ mod test {
let total_nodes = HotShotTestConfig::total_nodes();
// try to listen on non-voting node handle as it is the last handle
- let mut events = handles[total_nodes - 1].0.get_event_stream();
+ let mut events = handles[total_nodes - 1].0.event_stream();
for (handle, ..) in handles.iter() {
handle.hotshot.start_consensus().await;
}
let genesis_state = NodeState::mock();
+ let validated_state = ValidatedState::default();
let mut parent = {
// TODO refactor repeated code from other tests
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(genesis_state.clone()))
+ Payload::from_transactions([], &validated_state, &genesis_state)
+ .await
.expect("unable to create genesis payload");
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
let genesis_commitment = {
// TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
Header::genesis(
@@ -733,7 +737,7 @@ mod test {
// Check that each successive header satisfies invariants relative to its parent: all
// the fields which should be monotonic are.
for LeafInfo { leaf, .. } in leaf_chain.iter().rev() {
- let header = leaf.get_block_header().clone();
+ let header = leaf.block_header().clone();
if header.height == 0 {
parent = header;
continue;
diff --git a/builder/src/non_permissioned.rs b/builder/src/non_permissioned.rs
index 4742b4265..a9e726690 100644
--- a/builder/src/non_permissioned.rs
+++ b/builder/src/non_permissioned.rs
@@ -1,3 +1,4 @@
+use anyhow::Context;
use async_broadcast::{
broadcast, Receiver as BroadcastReceiver, RecvError, Sender as BroadcastSender, TryRecvError,
};
@@ -20,21 +21,24 @@ use hotshot_builder_core::{
BuildBlockInfo, BuilderProgress, BuilderState, BuiltFromProposedBlock, MessageType,
ResponseMessage,
},
- service::{run_non_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState},
+ service::{
+ run_non_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState,
+ ReceivedTransaction,
+ },
};
use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
data::{fake_commitment, Leaf, ViewNumber},
traits::{
block_contents::{vid_commitment, GENESIS_VID_NUM_STORAGE_NODES},
node_implementation::{ConsensusTime, NodeType},
+ EncodeBytes,
},
utils::BuilderCommitment,
};
use sequencer::{
- catchup::StatePeers, eth_signature_key::EthKeyPair, l1_client::L1Client, BuilderParams,
- ChainConfig, L1Params, NetworkParams, NodeState, Payload, PrivKey, PubKey, SeqTypes,
+ catchup::StatePeers, eth_signature_key::EthKeyPair, l1_client::L1Client, ChainConfig, L1Params,
+ NetworkParams, NodeState, Payload, PrivKey, PubKey, SeqTypes, ValidatedState,
};
use hotshot_events_service::{
@@ -57,15 +61,20 @@ pub struct BuilderConfig {
}
pub fn build_instance_state(
+ chain_config: ChainConfig,
l1_params: L1Params,
state_peers: Vec,
_: Ver,
) -> anyhow::Result {
- let l1_client = L1Client::new(l1_params.url, Address::default());
+ let l1_client = L1Client::new(l1_params.url, l1_params.events_max_block_range);
let instance_state = NodeState::new(
- ChainConfig::default(),
+ u64::MAX, // dummy node ID, only used for debugging
+ chain_config,
l1_client,
- Arc::new(StatePeers::::from_urls(state_peers)),
+ Arc::new(StatePeers::::from_urls(
+ state_peers,
+ Default::default(),
+ )),
);
Ok(instance_state)
}
@@ -75,50 +84,64 @@ impl BuilderConfig {
pub async fn init(
builder_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
+ node_count: NonZeroUsize,
instance_state: NodeState,
+ validated_state: ValidatedState,
hotshot_events_api_url: Url,
hotshot_builder_apis_url: Url,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result {
+ tracing::info!(
+ address = %builder_key_pair.fee_account(),
+ ?bootstrapped_view,
+ %tx_channel_capacity,
+ %event_channel_capacity,
+ ?max_api_timeout_duration,
+ buffered_view_num_count,
+ ?maximize_txns_count_timeout_duration,
+ "initializing builder",
+ );
+
// tx channel
- let (tx_sender, tx_receiver) = broadcast::>(channel_capacity.get());
+ let (mut tx_sender, tx_receiver) =
+ broadcast::>>(tx_channel_capacity.get());
+ tx_sender.set_overflow(true);
// da channel
- let (da_sender, da_receiver) = broadcast::>(channel_capacity.get());
+ let (da_sender, da_receiver) =
+ broadcast::>(event_channel_capacity.get());
// qc channel
- let (qc_sender, qc_receiver) = broadcast::>(channel_capacity.get());
+ let (qc_sender, qc_receiver) =
+ broadcast::>(event_channel_capacity.get());
// decide channel
let (decide_sender, decide_receiver) =
- broadcast::>(channel_capacity.get());
+ broadcast::>(event_channel_capacity.get());
// builder api request channel
- let (req_sender, req_receiver) = broadcast::>(channel_capacity.get());
-
- // builder api response channel
- let (res_sender, res_receiver) = unbounded();
+ let (req_sender, req_receiver) =
+ broadcast::>(event_channel_capacity.get());
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(instance_state.clone()))
+ Payload::from_transactions([], &validated_state, &instance_state)
+ .await
.expect("genesis payload construction failed");
+
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
+
let vid_commitment = {
- // TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
// create the global state
let global_state: GlobalState = GlobalState::::new(
req_sender,
- res_receiver,
tx_sender.clone(),
vid_commitment,
bootstrapped_view,
@@ -127,7 +150,6 @@ impl BuilderConfig {
);
let global_state = Arc::new(RwLock::new(global_state));
-
let global_state_clone = global_state.clone();
let builder_state = BuilderState::::new(
@@ -137,19 +159,23 @@ impl BuilderConfig {
leaf_commit: fake_commitment(),
builder_commitment,
},
- tx_receiver,
decide_receiver,
da_receiver,
qc_receiver,
req_receiver,
+ tx_receiver,
+ Vec::new() /* tx_queue */,
global_state_clone,
- res_sender,
- NonZeroUsize::new(1).unwrap(),
- bootstrapped_view,
- buffered_view_num_count as u64,
- maximise_txns_count_timeout_duration,
- base_fee,
+ node_count,
+ maximize_txns_count_timeout_duration,
+ instance_state
+ .chain_config
+ .base_fee
+ .as_u64()
+ .context("the base fee exceeds the maximum amount that a builder can pay (defined by u64::MAX)")?,
Arc::new(instance_state),
+ Duration::from_secs(60),
+ Arc::new(validated_state),
);
// spawn the builder event loop
@@ -164,41 +190,25 @@ impl BuilderConfig {
max_api_timeout_duration,
);
- let proxy_global_api_state = Arc::new(RwLock::new(proxy_global_state));
// start the hotshot api service
- run_builder_api_service(hotshot_builder_apis_url.clone(), proxy_global_api_state);
-
- // create a client for it
- // Start Client for the event streaming api
- tracing::info!(
- "Builder client connecting to hotshot events API at {}",
- hotshot_events_api_url.to_string()
- );
- let client = Client::::new(hotshot_events_api_url.clone());
-
- assert!(client.connect(None).await);
-
- tracing::info!("Builder client connected to the hotshot events api");
-
- // client subscrive to hotshot events
- let subscribed_events = client
- .socket("hotshot-events/events")
- .subscribe::>()
- .await
- .unwrap();
-
- tracing::info!("Builder client subscribed to hotshot events");
+ run_builder_api_service(hotshot_builder_apis_url.clone(), proxy_global_state);
// spawn the builder service
+ let events_url = hotshot_events_api_url.clone();
+ tracing::info!("Running permissionless builder against hotshot events API at {events_url}",);
async_spawn(async move {
- run_non_permissioned_standalone_builder_service(
- tx_sender,
+ let res = run_non_permissioned_standalone_builder_service(
da_sender,
qc_sender,
decide_sender,
- subscribed_events,
+ tx_sender,
+ events_url,
)
.await;
+ tracing::error!(?res, "builder service exited");
+ if res.is_err() {
+ panic!("Builder should restart.");
+ }
});
tracing::info!("Builder init finished");
@@ -234,12 +244,10 @@ mod test {
events::{Error as EventStreamApiError, Options as EventStreamingApiOptions},
events_source::{BuilderEvent, EventConsumer, EventsStreamer},
};
- use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
- traits::{
- block_contents::{BlockPayload, GENESIS_VID_NUM_STORAGE_NODES},
- node_implementation::NodeType,
- },
+ use hotshot_types::constants::Base;
+ use hotshot_types::traits::{
+ block_contents::{BlockPayload, GENESIS_VID_NUM_STORAGE_NODES},
+ node_implementation::NodeType,
};
use hotshot_types::{signature_key::BLSPubKey, traits::signature_key::SignatureKey};
use sequencer::{
@@ -248,8 +256,7 @@ mod test {
PersistenceOptions,
},
state::FeeAccount,
- transaction::Transaction,
- Payload,
+ NamespaceId, Payload, Transaction,
};
use std::time::Duration;
use surf_disco::Client;
@@ -281,10 +288,8 @@ mod test {
let num_non_staking_nodes = hotshot_config.config.num_nodes_without_stake;
// non-staking node handle
- let hotshot_context_handle = handles
- [NonPermissionedBuilderTestConfig::SUBSCRIBED_DA_NODE_ID]
- .0
- .clone();
+ let hotshot_context_handle =
+ &handles[NonPermissionedBuilderTestConfig::SUBSCRIBED_DA_NODE_ID].0;
// hotshot event streaming api url
let hotshot_events_streaming_api_url = HotShotTestConfig::hotshot_event_streaming_api_url();
@@ -294,11 +299,11 @@ mod test {
hotshot_events_streaming_api_url.clone(),
known_nodes_with_stake,
num_non_staking_nodes,
- hotshot_context_handle,
+ Arc::clone(hotshot_context_handle),
);
// builder api url
- let hotshot_builder_api_url = hotshot_config.config.builder_url.clone();
+ let hotshot_builder_api_url = hotshot_config.config.builder_urls[0].clone();
let builder_config = NonPermissionedBuilderTestConfig::init_non_permissioned_builder(
&hotshot_config,
@@ -310,7 +315,7 @@ mod test {
let builder_pub_key = builder_config.fee_account;
// Start a builder api client
- let builder_client = Client::::new(
+ let builder_client = Client::::new(
hotshot_builder_api_url.clone(),
);
assert!(builder_client.connect(Some(Duration::from_secs(60))).await);
@@ -333,10 +338,12 @@ mod test {
// sleep and wait for builder service to startup
async_sleep(Duration::from_millis(3000)).await;
+ let test_view_num = 0;
+
// test getting available blocks
let available_block_info = match builder_client
.get::>>(&format!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -363,7 +370,7 @@ mod test {
// Test claiming blocks
let _available_block_data = match builder_client
.get::>(&format!(
- "block_info/claimblock/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimblock/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -380,7 +387,7 @@ mod test {
// Test claiming block header input
let _available_block_header = match builder_client
.get::>(&format!(
- "block_info/claimheaderinput/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimheaderinput/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -409,7 +416,7 @@ mod test {
}
}
- let txn = Transaction::new(Default::default(), vec![1, 2, 3]);
+ let txn = Transaction::new(NamespaceId::from(1), vec![1, 2, 3]);
match builder_client
.post::<()>("txn_submit/submit")
.body_json(&txn)
diff --git a/builder/src/permissioned.rs b/builder/src/permissioned.rs
index 0f40b4371..75e751270 100644
--- a/builder/src/permissioned.rs
+++ b/builder/src/permissioned.rs
@@ -12,8 +12,8 @@ use hotshot::{
traits::{
election::static_committee::GeneralStaticCommittee,
implementations::{
- derive_libp2p_peer_id, CombinedNetworks, KeyPair, Libp2pNetwork,
- NetworkingMetricsValue, PushCdnNetwork, WebServerNetwork, WrappedSignatureKey,
+ derive_libp2p_peer_id, CdnMetricsValue, CombinedNetworks, KeyPair, Libp2pNetwork,
+ PushCdnNetwork, Topic, WrappedSignatureKey,
},
},
types::{SignatureKey, SystemContextHandle},
@@ -28,7 +28,7 @@ use hotshot_types::{
event::Event,
light_client::StateKeyPair,
signature_key::{BLSPrivKey, BLSPubKey},
- traits::{election::Membership, metrics::Metrics},
+ traits::{election::Membership, metrics::Metrics, EncodeBytes},
utils::BuilderCommitment,
HotShotConfig, PeerConfig, ValidatorConfig,
};
@@ -60,25 +60,27 @@ use hotshot_builder_core::{
service::{
run_non_permissioned_standalone_builder_service,
run_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState,
+ ReceivedTransaction,
},
};
use hotshot_state_prover;
-use jf_primitives::{
- merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme},
- signatures::bls_over_bn254::VerKey,
-};
-use sequencer::state_signature::StakeTableCommitmentType;
-use sequencer::{catchup::mock::MockStateCatchup, eth_signature_key::EthKeyPair, ChainConfig};
+use jf_merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme};
+use jf_signature::bls_over_bn254::VerKey;
use sequencer::{
- catchup::StatePeers,
+ catchup::{mock::MockStateCatchup, StatePeers},
context::{Consensus, SequencerContext},
+ eth_signature_key::EthKeyPair,
+ genesis::L1Finalized,
l1_client::L1Client,
network,
+ network::libp2p::split_off_peer_id,
persistence::SequencerPersistence,
state::FeeAccount,
state::ValidatedState,
+ state_signature::StakeTableCommitmentType,
state_signature::{static_stake_table_commitment, StateSigner},
- BuilderParams, L1Params, NetworkParams, Node, NodeState, Payload, PrivKey, PubKey, SeqTypes,
+ ChainConfig, Genesis, L1Params, NetworkParams, Node, NodeState, Payload, PrivKey, PubKey,
+ SeqTypes,
};
use std::{alloc::System, any, fmt::Debug, mem};
use std::{marker::PhantomData, net::IpAddr};
@@ -87,7 +89,6 @@ use tide_disco::{app, method::ReadState, App, Url};
use vbs::version::StaticVersionType;
use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
data::{fake_commitment, Leaf, ViewNumber},
traits::{
block_contents::{vid_commitment, GENESIS_VID_NUM_STORAGE_NODES},
@@ -109,7 +110,7 @@ pub struct BuilderContext<
Ver: StaticVersionType + 'static,
> {
/// The consensus handle
- pub hotshot_handle: Consensus,
+ pub hotshot_handle: Arc>,
/// Index of this sequencer node
pub node_index: u64,
@@ -129,21 +130,21 @@ pub struct BuilderContext<
#[allow(clippy::too_many_arguments)]
pub async fn init_node(
+ genesis: Genesis,
network_params: NetworkParams,
metrics: &dyn Metrics,
- builder_params: BuilderParams,
l1_params: L1Params,
hotshot_builder_api_url: Url,
eth_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
bind_version: Ver,
persistence: P,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
is_da: bool,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result> {
// Orchestrator client
let validator_args = ValidatorArgs {
@@ -166,19 +167,36 @@ pub async fn init_node::SignatureKey>(&my_config.private_key)
.with_context(|| "Failed to derive Libp2p peer ID")?;
- let config = NetworkConfig::get_complete_config(
+ let mut config = NetworkConfig::get_complete_config(
&orchestrator_client,
- None,
my_config.clone(),
// Register in our Libp2p advertise address and public key so other nodes
// can contact us on startup
Some(network_params.libp2p_advertise_address),
Some(libp2p_public_key),
- false,
)
.await?
.0;
+ // If the `Libp2p` bootstrap nodes were supplied via the command line, override those
+ // present in the config file.
+ if let Some(bootstrap_nodes) = network_params.libp2p_bootstrap_nodes {
+ if let Some(libp2p_config) = config.libp2p_config.as_mut() {
+ // If the libp2p configuration is present, we can override the bootstrap nodes.
+
+ // Split off the peer ID from the addresses
+ libp2p_config.bootstrap_nodes = bootstrap_nodes
+ .into_iter()
+ .map(split_off_peer_id)
+ .collect::, _>>()
+ .with_context(|| "Failed to parse peer ID from bootstrap node")?;
+ } else {
+ // If not, don't try launching with them. Eventually we may want to
+ // provide a default configuration here instead.
+ tracing::warn!("No libp2p configuration found, ignoring bootstrap nodes");
+ }
+ }
+
tracing::info!(
node_id = config.node_index,
stake_table = ?config.config.known_nodes_with_stake,
@@ -190,11 +208,12 @@ pub async fn init_node Some(b),
+ Some(L1Finalized::Number { number }) => {
+ Some(l1_client.wait_for_finalized_block(number).await)
+ }
+ None => None,
+ };
- let instance_state = NodeState::new(
- ChainConfig::default(),
+ let instance_state = NodeState {
+ chain_config: genesis.chain_config,
l1_client,
- Arc::new(StatePeers::::from_urls(network_params.state_peers)),
- );
+ genesis_header: genesis.header,
+ genesis_state: genesis_state.clone(),
+ l1_genesis,
+ peers: Arc::new(StatePeers::::from_urls(
+ network_params.state_peers,
+ network_params.catchup_backoff,
+ )),
+ node_id: node_index,
+ upgrades: Default::default(),
+ current_version: Ver::VERSION,
+ };
let stake_table_commit =
static_stake_table_commitment(&config.config.known_nodes_with_stake, STAKE_TABLE_CAPACITY);
@@ -276,18 +303,19 @@ pub async fn init_node,
+ hotshot_handle: Arc>,
state_signer: StateSigner,
node_index: u64,
eth_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
instance_state: NodeState,
+ validated_state: ValidatedState,
hotshot_builder_api_url: Url,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result {
// tx channel
- let (tx_sender, tx_receiver) = broadcast::>(channel_capacity.get());
+ let (mut tx_sender, tx_receiver) =
+ broadcast::>>(tx_channel_capacity.get());
+ tx_sender.set_overflow(true);
// da channel
- let (da_sender, da_receiver) = broadcast::>(channel_capacity.get());
+ let (da_sender, da_receiver) =
+ broadcast::>(event_channel_capacity.get());
// qc channel
- let (qc_sender, qc_receiver) = broadcast::>(channel_capacity.get());
+ let (qc_sender, qc_receiver) =
+ broadcast::>(event_channel_capacity.get());
// decide channel
let (decide_sender, decide_receiver) =
- broadcast::>(channel_capacity.get());
+ broadcast::>(event_channel_capacity.get());
// builder api request channel
- let (req_sender, req_receiver) = broadcast::>(channel_capacity.get());
+ let (req_sender, req_receiver) =
+ broadcast::>(event_channel_capacity.get());
- // builder api response channel
- let (res_sender, res_receiver) = unbounded();
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(instance_state.clone()))
+ Payload::from_transactions([], &validated_state, &instance_state)
+ .await
.expect("genesis payload construction failed");
+
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
+
let vid_commitment = {
// TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
// create the global state
let global_state: GlobalState = GlobalState::::new(
req_sender,
- res_receiver,
tx_sender.clone(),
vid_commitment,
bootstrapped_view,
@@ -437,22 +471,26 @@ impl::new(
+ let builder_client = Client::::new(
hotshot_builder_api_url.clone(),
);
assert!(builder_client.connect(Some(Duration::from_secs(60))).await);
@@ -605,15 +641,16 @@ mod test {
)
.expect("Claim block signing failed");
+ let test_view_num = 0;
// test getting available blocks
tracing::info!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
);
// sleep and wait for builder service to startup
async_sleep(Duration::from_millis(3000)).await;
let available_block_info = match builder_client
.get::>>(&format!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -640,7 +677,7 @@ mod test {
// Test claiming blocks
let _available_block_data = match builder_client
.get::>(&format!(
- "block_info/claimblock/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimblock/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -657,7 +694,7 @@ mod test {
// Test claiming block header input
let _available_block_header = match builder_client
.get::>(&format!(
- "block_info/claimheaderinput/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimheaderinput/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -686,7 +723,7 @@ mod test {
}
}
- let txn = Transaction::new(Default::default(), vec![1, 2, 3]);
+ let txn = Transaction::new(NamespaceId::from(1), vec![1, 2, 3]);
match builder_client
.post::<()>("txn_submit/submit")
.body_json(&txn)
diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json
index ad7426e41..2043850b2 100644
--- a/contract-bindings/artifacts/LightClientMock_bytecode.json
+++ b/contract-bindings/artifacts/LightClientMock_bytecode.json
@@ -1 +1 @@
-"0x60a0604052306080523480156200001557600080fd5b50604051620063ca380380620063ca83398101604081905262000038916200041b565b6200004262000056565b6200004e82826200010a565b5050620004ee565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b81516001600160401b03161515806200012f575060208201516001600160401b031615155b806200013d57506080820151155b806200014b575060a0820151155b8062000159575060c0820151155b8062000167575060e0820151155b8062000177575063ffffffff8116155b1562000196576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff16021790555060006200038483620003a160201b60201c565b600181905560e09093015160028190556003939093555050600455565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b80516001600160401b03811681146200040157600080fd5b919050565b805163ffffffff811681146200040157600080fd5b6000808284036101208112156200043157600080fd5b610100808212156200044257600080fd5b60405191508082016001600160401b03811183821017156200047457634e487b7160e01b600052604160045260246000fd5b6040526200048285620003e9565b82526200049260208601620003e9565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350620004e381860162000406565b925050509250929050565b608051615eb262000518600039600081816114d2015281816114fb01526116e90152615eb26000f3fe6080604052600436106101965760003560e01c8063715018a6116100e1578063a244d5961161008a578063bd32519a11610064578063bd32519a146106bf578063ca6fe85514610701578063f068205414610717578063f2fde38b1461074957600080fd5b8063a244d596146105e6578063aa92273214610606578063ad3cb1cc1461066957600080fd5b80637f17baad116100bb5780637f17baad146104df57806382d07ff3146105945780638da5cb5b146105a957600080fd5b8063715018a61461046a578063766718081461047f57806376b6b7cb146104c957600080fd5b8063409939b71161014357806352d1902d1161011d57806352d1902d1461042a578063628277331461043f57806369cc6a041461045557600080fd5b8063409939b7146103735780634847ae5d146103935780634f1ef2861461041757600080fd5b8063313df7b111610174578063313df7b1146102b1578063382b215a146102e95780633949d1e91461030d57600080fd5b8063013fa5fc1461019b5780630d8e6e2c146101bd578063202a0adb146101ef575b600080fd5b3480156101a757600080fd5b506101bb6101b6366004615583565b610769565b005b3480156101c957600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101fb57600080fd5b506101bb61020a3660046156c5565b6000805463ffffffff600160401b9182900416825260056020818152604093849020855181549287015167ffffffffffffffff9081169095027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909316941693909317178255918301516001820155606083015160028201556080830151600382015560a0830151600482015560c08301519181019190915560e090910151600690910155565b3480156102bd57600080fd5b506006546102d1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e6565b3480156102f557600080fd5b506102ff60035481565b6040519081526020016101e6565b34801561031957600080fd5b506101bb6103283660046156e2565b6000805467ffffffffffffffff9092166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff909216919091179055565b34801561037f57600080fd5b506101bb61038e36600461574c565b610881565b34801561039f57600080fd5b506103a8610bb9565b6040516101e6919060006101008201905067ffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101bb610425366004615924565b610ca1565b34801561043657600080fd5b506102ff610cc0565b34801561044b57600080fd5b506102ff60025481565b34801561046157600080fd5b506101bb610cef565b34801561047657600080fd5b506101bb610da1565b34801561048b57600080fd5b506000546104b0906c01000000000000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101e6565b3480156104d557600080fd5b506102ff60015481565b3480156104eb57600080fd5b5061054d6104fa3660046159de565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460069095015467ffffffffffffffff80861697600160401b9096041695939492939192919088565b6040805167ffffffffffffffff998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101e6565b3480156105a057600080fd5b506103a8610db3565b3480156105b557600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102d1565b3480156105f257600080fd5b506101bb6106013660046159f9565b610e98565b34801561061257600080fd5b506102ff6106213660046156c5565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b34801561067557600080fd5b506106b26040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e69190615a64565b3480156106cb57600080fd5b506006546106f19074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101e6565b34801561070d57600080fd5b506102ff60045481565b34801561072357600080fd5b506000546107349063ffffffff1681565b60405163ffffffff90911681526020016101e6565b34801561075557600080fd5b506101bb610764366004615583565b611024565b61077161107b565b6001600160a01b0381166107b1576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b03908116908216036107f9576040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffff000000000000000000000000000000000000000000166001600160a01b0383811691909117740100000000000000000000000000000000000000001791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60065474010000000000000000000000000000000000000000900460ff1680156108b657506006546001600160a01b03163314155b1561092f576006546001600160a01b03166108fd576040517f25cda3ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3a6478000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610937610db3565b51825167ffffffffffffffff91821691161115806109785750610958610db3565b6020015167ffffffffffffffff16826020015167ffffffffffffffff1611155b156109af576040517f051c46ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546109de9063ffffffff8116906c01000000000000000000000000900467ffffffffffffffff16615aad565b6000805463ffffffff600160401b918290041682526005602052604090912054919250900467ffffffffffffffff90811690821614801581610a3757508167ffffffffffffffff16846020015167ffffffffffffffff16115b15610a7f576040517f1b2335f800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024015b60405180910390fd5b610a8c84604001516110ef565b610a9984606001516110ef565b610aa684608001516110ef565b610ab38460a001516110ef565b610ac08460c001516110ef565b8015610ace57610ace61115f565b610ad884846112bc565b6000805463ffffffff600160401b9182900416825260056020818152604093849020885181548a84015167ffffffffffffffff9081169687027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169216918217178255898601516001830181905560608b0151600284015560808b0151600384015560a08b0151600484015560c08b01519483019490945560e08a015160069092019190915593519182529192917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610c15604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060008054640100000000900463ffffffff16815260056020818152604092839020835161010081018552815467ffffffffffffffff8082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610ca96114c7565b610cb282611597565b610cbc82826115d8565b5050565b6000610cca6116de565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cf761107b565b60065474010000000000000000000000000000000000000000900460ff1615610d6d57600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b6040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610da961107b565b610d9f6000611740565b610e0f604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000805463ffffffff600160401b9182900416825260056020818152604093849020845161010081018652815467ffffffffffffffff8082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610ede5750825b905060008267ffffffffffffffff166001148015610efb5750303b155b905081158015610f09575080155b15610f40576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610f8657845468ff00000000000000001916600160401b1785555b610f8f866117c9565b610f976117da565b600080547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff16600160401b179055610fcf88886117e2565b831561101a57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b61102c61107b565b6001600160a01b03811661106f576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610a76565b61107881611740565b50565b336110ad7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d9f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a76565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811080610cbc5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610a76565b60008054600160401b80820463ffffffff16808452600560208181526040808720815161010081018352815467ffffffffffffffff808216835297900487168185015260018083015482850152600280840154606080850191909152600380860154608080870182905260048089015460a08901819052898d015460c08a018190526006909a01805460e0909a01999099528a51808d0194909452838b015282850198909852885180830390940184520190965280519087012085548355948590558354905595895293909252915490559390929091600c916112549185916c01000000000000000000000000900416615ad1565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556000546040516c0100000000000000000000000090910490911681527fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f9150602001610876565b60006112c6611ad2565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061130557611305615af2565b602002602001018181525050836000015167ffffffffffffffff168160018151811061133357611333615af2565b602002602001018181525050836020015167ffffffffffffffff168160028151811061136157611361615af2565b60200260200101818152505083604001518160038151811061138557611385615af2565b6020026020010181815250508360600151816004815181106113a9576113a9615af2565b60209081029190910181019190915260008054600160401b900463ffffffff168152600591829052604090206003015482519091839181106113ed576113ed615af2565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005909152604090206004015481518290600690811061143157611431615af2565b60209081029190910181019190915260008054600160401b900463ffffffff16815260059182905260409020015481518290600790811061147457611474615af2565b60200260200101818152505061148b8282856120b3565b6114c1576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061156057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115547f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610d9f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61159f61107b565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610876565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611632575060408051601f3d908101601f1916820190925261162f91810190615b08565b60015b611673576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a76565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146116cf576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a76565b6116d9838361219e565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d9f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6117d16121f4565b61107881612256565b610d9f6121f4565b815167ffffffffffffffff161515806118085750602082015167ffffffffffffffff1615155b8061181557506080820151155b80611822575060a0820151155b8061182f575060c0820151155b8061183c575060e0820151155b8061184b575063ffffffff8116155b15611882576040517fa1ba07ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550806000806101000a81548163ffffffff021916908363ffffffff1602179055506000611ab58360808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b600181905560e09093015160028190556003939093555050600455565b611ada61525f565b620100008152600860208201527f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee816040820151527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b6020604083015101527f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d6060820151527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c6020606083015101527f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac86080820151527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d36020608083015101527f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c83960a0820151527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea602060a083015101527f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce760c0820151527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b6602060c083015101527f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a660e0820151527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d602060e083015101527f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f610100820151527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b602061010083015101527f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e08610120820151527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c14602061012083015101527f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e7610140820151527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba602061014083015101527f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba655022610160820151527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f602061016083015101527f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df2610180820151527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e602061018083015101527f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f76101a0820151527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b60206101a083015101527f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec736101c0820151527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc2860206101c083015101527f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508036101e0820151527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d4569091582460206101e083015101527f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a610200820151527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf602061020083015101527f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db44610220820151527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab602061022083015101527f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a75610240820151527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be1602061024083015101527f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9610260820151527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab3706020610260830151015290565b60006120be8261225e565b6120e1836000815181106120d4576120d4615af2565b60200260200101516110ef565b6120f7836001815181106120d4576120d4615af2565b61210d836002815181106120d4576120d4615af2565b612123836003815181106120d4576120d4615af2565b612139836004815181106120d4576120d4615af2565b61214f836005815181106120d4576120d4615af2565b612165836006815181106120d4576120d4615af2565b61217b836007815181106120d4576120d4615af2565b6000612188858585612396565b905061219381612517565b9150505b9392505050565b6121a7826129df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156121ec576116d98282612a87565b610cbc612aff565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d9f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61102c6121f4565b805161226990612b37565b6122768160200151612b37565b6122838160400151612b37565b6122908160600151612b37565b61229d8160800151612b37565b6122aa8160a00151612b37565b6122b78160c00151612b37565b6122c48160e00151612b37565b6122d2816101000151612b37565b6122e0816101200151612b37565b6122ee816101400151612b37565b6122fc816101600151612b37565b61230a816101800151612b37565b612318816101a001516110ef565b612326816101c001516110ef565b612334816101e001516110ef565b6123428161020001516110ef565b6123508161022001516110ef565b61235e8161024001516110ef565b61236c8161026001516110ef565b61237a8161028001516110ef565b612388816102a001516110ef565b611078816102c001516110ef565b61239e6154dd565b83602001518351146123dc576040517f41f53b1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123e9858585612be1565b905060006123fa8660000151612f12565b9050600061240d828460a00151886132f6565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161245057905050905060006124898a858a898787613356565b60a08701516060870151919250907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6040805180820182526000808252602080830182905283518085018552828152908101829052835160028082526060820190955291937f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001939285918160200160208202803683375050604080516002808252606082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161259d57905050905060006001905080836000815181106125e0576125e0615af2565b6020026020010181815250508760c001518260008151811061260457612604615af2565b602002602001018190525087600001518360018151811061262757612627615af2565b6020026020010181815250508760e001518260018151811061264b5761264b615af2565b6020026020010181905250612660828461338b565b608089015151909550606093508392509050600061267f826002615b21565b61268a906001615b21565b90508067ffffffffffffffff8111156126a5576126a561559e565b6040519080825280602002602001820160405280156126ce578160200160208202803683370190505b5093508067ffffffffffffffff8111156126ea576126ea61559e565b60405190808252806020026020018201604052801561272f57816020015b60408051808201909152600080825260208201528152602001906001900390816127085790505b509250505060008060005b8960800151518110156127d3578960800151818151811061275d5761275d615af2565b602002602001015185838151811061277757612777615af2565b6020026020010181815250508960a00151818151811061279957612799615af2565b60200260200101518483815181106127b3576127b3615af2565b60209081029190910101526127c9600183615b21565b915060010161273a565b5088602001518482815181106127eb576127eb615af2565b6020026020010181815250508860c0015183828151811061280e5761280e615af2565b6020908102919091010152612824600182615b21565b895160408b01519192509060008982840990508087858151811061284a5761284a615af2565b6020026020010181815250505050508860e0015183828151811061287057612870615af2565b6020908102919091010152612886600182615b21565b60608a01519091508781840892505061289e82613485565b8482815181106128b0576128b0615af2565b6020026020010181815250506128e8604080518082018252600080825260209182015281518083019092526001825260029082015290565b8382815181106128fa576128fa615af2565b6020026020010181905250612917612912848661338b565b6134db565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe481525090506129d58382846129d061357a565b61364b565b9695505050505050565b806001600160a01b03163b600003612a2e576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a76565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612aa49190615b34565b600060405180830381855af49150503d8060008114612adf576040519150601f19603f3d011682016040523d82523d6000602084013e612ae4565b606091505b5091509150612af485838361372f565b925050505b92915050565b3415610d9f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615612b7157505050565b8251602084015182600384858586098509088382830914838210848410161693505050816116d95760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610a76565b612c2960405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805180820190915260608152600060208201527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001612c6a8287876137a4565b81518451612c7790613b85565b612c848660200151613b85565b612c918760400151613b85565b612c9e8860600151613b85565b612cab8960800151613b85565b604051602001612cc096959493929190615b50565b60408051601f198184030181529190528252612cdb82613c48565b50612ce582613c48565b6060840152612cf382613c48565b6080840152815160a0850151612d0890613b85565b604051602001612d19929190615bcf565b60408051601f198184030181529190528252612d3482613c48565b8352815160c0850151612d4690613b85565b612d538660e00151613b85565b612d61876101000151613b85565b612d6f886101200151613b85565b612d7d896101400151613b85565b604051602001612d9296959493929190615b50565b60408051601f198184030181529190528252612dad82613c48565b60a084015281516101a0850151612dc390613cbc565b612dd1866101c00151613cbc565b612ddf876101e00151613cbc565b612ded886102000151613cbc565b612dfb896102200151613cbc565b604051602001612e1096959493929190615bfe565b60408051601f19818403018152919052808352610240850151612e3290613cbc565b612e40866102600151613cbc565b612e4e876102800151613cbc565b612e5c886102a00151613cbc565b612e6a896102c00151613cbc565b604051602001612e7f96959493929190615bfe565b60408051601f198184030181529190528252612e9a82613c48565b60c08401528151610160850151612eb090613b85565b612ebe866101800151613b85565b604051602001612ed093929190615c3a565b60408051601f198184030181529190528252612eeb82613c48565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612f446040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612fd857506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b81620200000361306d57506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b81620400000361310257506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b81620800000361319757506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b81621000000361322c57506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b816020036132bf57506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b6040517fe2ef09e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61331a60405180606001604052806000815260200160008152602001600081525090565b6133248484613e08565b8082526133349085908590613e6e565b6020820152805161334a90859084908690613ef4565b60408201529392505050565b6000806133648587896140bb565b90506133748886898988886141b9565b61337f8187866144d7565b98975050505050505050565b604080518082019091526000808252602082015282518251146133f05760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d617463686044820152606401610a76565b61342e8360008151811061340657613406615af2565b60200260200101518360008151811061342157613421615af2565b6020026020010151614539565b905060015b825181101561347e576134748261346f86848151811061345557613455615af2565b602002602001015186858151811061342157613421615af2565b6145dd565b9150600101613433565b5092915050565b60006134b17f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183615c93565b612af9907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001615cb5565b6040805180820190915260008082526020820152815160208301511590151615613503575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516135489190615c93565b613572907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615cb5565b905292915050565b6135a56040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806137215760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610a76565b50151590505b949350505050565b6060826137445761373f82614684565b612197565b815115801561375b57506001600160a01b0384163b155b1561379d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a76565b5080612197565b825160fe906137df6137b583613cbc565b6040516020016137c791815260200190565b604051602081830303815290604052600060046146c6565b6138196137ef8660000151613cbc565b60405160200161380191815260200190565b604051602081830303815290604052600060086146c6565b6138296137ef8760200151613cbc565b60405160200161383c9493929190615cc8565b60408051601f198184030181529190528085526138596001613cbc565b6138827f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a613cbc565b6138ab7f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025613cbc565b6138d47f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a613cbc565b6138fd7f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881613cbc565b60405160200161391296959493929190615bfe565b60408051601f1981840301815291905280855260e084015161393390613b85565b613941856101000151613b85565b61394f866101200151613b85565b61395d876101400151613b85565b61396b886101600151613b85565b613979896101800151613b85565b6139878a6101e00151613b85565b60405160200161399e989796959493929190615d1f565b60408051601f198184030181529190528085526102008401516139c090613b85565b6139ce856102200151613b85565b6139dc866102400151613b85565b6139ea876101a00151613b85565b6139f8886101c00151613b85565b613a06896102600151613b85565b604051602001613a1c9796959493929190615dc4565b60408051601f19818403018152918152818652840151613a3b90613b85565b613a488560600151613b85565b613a558660800151613b85565b613a628760a00151613b85565b613a6f8860c00151613b85565b604051602001613a8496959493929190615b50565b60408051601f198184030181529190528085528251613abb908490600090613aae57613aae615af2565b6020026020010151613cbc565b613ad184600181518110613aae57613aae615af2565b613ae785600281518110613aae57613aae615af2565b613afd86600381518110613aae57613aae615af2565b613b1387600481518110613aae57613aae615af2565b613b2988600581518110613aae57613aae615af2565b613b3f89600681518110613aae57613aae615af2565b613b558a600781518110613aae57613aae615af2565b604051602001613b6d99989796959493929190615e56565b60408051601f19818403018152919052909352505050565b805160208201516060916000911590151615613bbe577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b10613c1257507f80000000000000000000000000000000000000000000000000000000000000005b8251613c1f908217613cbc565b604051602001613c3191815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613c7f5760208186018101518383015201613c65565b505060209182019020908601819052925060006129d57f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185615c93565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b81516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838015613e5e5784935060005b82811015613e5257838586099450600101613e3c565b50600184039350613e65565b6001830393505b50505092915050565b600082600103613e8057506001612197565b81600003613e9057506000612197565b60408401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190600090828186099050858015613ed257600187039250613ed9565b6001840392505b50613ee3826147ee565b915082828209979650505050505050565b82516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838303613f8757600160005b82811015613f7a57818703613f5b57878181518110613f4857613f48615af2565b6020026020010151945050505050613727565b8380613f6957613f69615c7d565b896060015183099150600101613f27565b5060009350505050613727565b6000806000808a604001519050600080613fa18d886148a6565b905060008767ffffffffffffffff811115613fbe57613fbe61559e565b604051908082528060200260200182016040528015613fe7578160200160208202803683370190505b509050888b850993506001925060005b8881101561402c57602081026020840101519550898d878c030896508987850960208281028401018890529350600101613ff7565b50614036836147ee565b925060005b888110156140a95760208102602084010151955089868609975089848909975060005b8981101561408857808214614080576020810260208401015197508a888a0998505b60010161405e565b506020810260208f010151955089868909975089888c089a5060010161403b565b50505050505050505050949350505050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b6141c7868686868587614997565b60c085015182517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019190819081908690601490811061420857614208615af2565b60200260200101818152505085600001518460148151811061422c5761422c615af2565b6020026020010181905250828282099050808560158151811061425157614251615af2565b60200260200101818152505085602001518460158151811061427557614275615af2565b6020026020010181905250828282099050808560168151811061429a5761429a615af2565b6020026020010181815250508560400151846016815181106142be576142be615af2565b602002602001018190525082828209905080856017815181106142e3576142e3615af2565b60200260200101818152505085606001518460178151811061430757614307615af2565b6020026020010181905250828282099050808560188151811061432c5761432c615af2565b60200260200101818152505085608001518460188151811061435057614350615af2565b6020026020010181905250828282099050808560198151811061437557614375615af2565b60200260200101818152505088604001518460198151811061439957614399615af2565b60200260200101819052508282820990508085601a815181106143be576143be615af2565b602002602001018181525050886060015184601a815181106143e2576143e2615af2565b60200260200101819052508282820990508085601b8151811061440757614407615af2565b602002602001018181525050886080015184601b8151811061442b5761442b615af2565b60200260200101819052508282820990508085601c8151811061445057614450615af2565b6020026020010181815250508860a0015184601c8151811061447457614474615af2565b60200260200101819052508282820990508760e0015185601d8151811061449d5761449d615af2565b6020026020010181815250508560a0015184601d815181106144c1576144c1615af2565b6020026020010181905250505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018381039060005b600a8110156145305760206015820102840151602082026101a00186015183848284098608945050506001016144ff565b50509392505050565b6040805180820190915260008082526020820152614555615530565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061458757600080fd5b50806145d55760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610a76565b505092915050565b60408051808201909152600080825260208201526145f961554e565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061463657600080fd5b50806145d55760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610a76565b8051156146945780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060816146d481601f615b21565b10156147225760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610a76565b61472c8284615b21565b8451101561477c5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610a76565b60608215801561479b57604051915060008252602082016040526147e5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156147d45780518352602092830192016147bc565b5050858452601f01601f1916604052505b50949350505050565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa92505060005192508161489f5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610a76565b5050919050565b606082602001518211156148e6576040517f8c5e11f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018467ffffffffffffffff8111156149275761492761559e565b604051908082528060200260200182016040528015614950578160200160208202803683370190505b50935084151915613e655760208401856020028101600182526020820191505b8082101561498c57828585099350838252602082019150614970565b505050505092915050565b6000806000806000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110614b2057614b20615af2565b60200260200101819052508587600081518110614b3f57614b3f615af2565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110614c2157614c21615af2565b6020908102919091010152614c368582615cb5565b87600181518110614c4957614c49615af2565b602002602001018181525050886101a0015187600281518110614c6e57614c6e615af2565b602002602001018181525050886101c0015187600381518110614c9357614c93615af2565b602002602001018181525050886101e0015187600481518110614cb857614cb8615af2565b60200260200101818152505088610200015187600581518110614cdd57614cdd615af2565b6020026020010181815250508b60e0015188600281518110614d0157614d01615af2565b60200260200101819052508b610100015188600381518110614d2557614d25615af2565b60200260200101819052508b610120015188600481518110614d4957614d49615af2565b60200260200101819052508b610140015188600581518110614d6d57614d6d615af2565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614d9c57614d9c615af2565b6020026020010181815250508b610160015188600681518110614dc157614dc1615af2565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614df057614df0615af2565b6020026020010181815250508b610180015188600781518110614e1557614e15615af2565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614e4e57614e4e615af2565b6020026020010181815250508b6101e0015188600881518110614e7357614e73615af2565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614eac57614eac615af2565b6020026020010181815250508b610200015188600981518110614ed157614ed1615af2565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614f0a57614f0a615af2565b6020026020010181815250508b610220015188600a81518110614f2f57614f2f615af2565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614f6857614f68615af2565b6020026020010181815250508b610240015188600b81518110614f8d57614f8d615af2565b602002602001018190525088610220015181614fa99190615cb5565b87600c81518110614fbc57614fbc615af2565b6020026020010181815250508b6101a0015188600c81518110614fe157614fe1615af2565b6020026020010181905250600187600d8151811061500157615001615af2565b6020026020010181815250508b6101c0015188600d8151811061502657615026615af2565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e8151811061507657615076615af2565b6020026020010181815250508b610260015188600e8151811061509b5761509b615af2565b602090810291909101015289516150b29082615cb5565b87600f815181106150c5576150c5615af2565b6020026020010181815250508860c0015188600f815181106150e9576150e9615af2565b60200260200101819052508060018b510860a08c015190935081908009915080828409925080836020601002890151099150818760108151811061512f5761512f615af2565b6020026020010181815250508860e001518860108151811061515357615153615af2565b602002602001018190525080836020601102890151099150818760118151811061517f5761517f615af2565b602002602001018181525050886101000151886011815181106151a4576151a4615af2565b60200260200101819052508083602060120289015109915081876012815181106151d0576151d0615af2565b602002602001018181525050886101200151886012815181106151f5576151f5615af2565b602002602001018190525080836020601302890151099150818760138151811061522157615221615af2565b6020026020010181815250508861014001518860138151811061524657615246615af2565b6020026020010181905250505050505050505050505050565b6040518061028001604052806000815260200160008152602001615296604051806040016040528060008152602001600081525090565b81526020016152b8604051806040016040528060008152602001600081525090565b81526020016152da604051806040016040528060008152602001600081525090565b81526020016152fc604051806040016040528060008152602001600081525090565b815260200161531e604051806040016040528060008152602001600081525090565b8152602001615340604051806040016040528060008152602001600081525090565b8152602001615362604051806040016040528060008152602001600081525090565b8152602001615384604051806040016040528060008152602001600081525090565b81526020016153a6604051806040016040528060008152602001600081525090565b81526020016153c8604051806040016040528060008152602001600081525090565b81526020016153ea604051806040016040528060008152602001600081525090565b815260200161540c604051806040016040528060008152602001600081525090565b815260200161542e604051806040016040528060008152602001600081525090565b8152602001615450604051806040016040528060008152602001600081525090565b8152602001615472604051806040016040528060008152602001600081525090565b8152602001615494604051806040016040528060008152602001600081525090565b81526020016154b6604051806040016040528060008152602001600081525090565b81526020016154d8604051806040016040528060008152602001600081525090565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016154b6604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b03811681146132f157600080fd5b60006020828403121561559557600080fd5b6121978261556c565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156155d8576155d861559e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156156075761560761559e565b604052919050565b803567ffffffffffffffff811681146132f157600080fd5b600061010080838503121561563b57600080fd5b6040519081019067ffffffffffffffff8211818310171561565e5761565e61559e565b8160405280925061566e8461560f565b815261567c6020850161560f565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b600061010082840312156156d857600080fd5b6121978383615627565b6000602082840312156156f457600080fd5b6121978261560f565b60006040828403121561570f57600080fd5b6040516040810181811067ffffffffffffffff821117156157325761573261559e565b604052823581526020928301359281019290925250919050565b60008082840361058081121561576157600080fd5b61576b8585615627565b9250610100610480807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00840112156157a257600080fd5b6157aa6155b4565b92506157b8878388016156fd565b83526101406157c9888289016156fd565b60208501526101806157dd89828a016156fd565b60408601526101c06157f18a828b016156fd565b60608701526102006158058b828c016156fd565b60808801526102406158198c828d016156fd565b60a089015261028061582d8d828e016156fd565b60c08a01526102c06158418e828f016156fd565b60e08b01526158548e6103008f016156fd565b898b01526158668e6103408f016156fd565b6101208b015261587a8e6103808f016156fd565b878b015261588c8e6103c08f016156fd565b6101608b01526158a08e6104008f016156fd565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561593757600080fd5b6159408361556c565b915060208084013567ffffffffffffffff8082111561595e57600080fd5b818601915086601f83011261597257600080fd5b8135818111156159845761598461559e565b61599684601f19601f840116016155de565b915080825287848285010111156159ac57600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff811681146132f157600080fd5b6000602082840312156159f057600080fd5b612197826159ca565b60008060006101408486031215615a0f57600080fd5b615a198585615627565b9250615a2861010085016159ca565b9150615a37610120850161556c565b90509250925092565b60005b83811015615a5b578181015183820152602001615a43565b50506000910152565b6020815260008251806020840152615a83816040850160208701615a40565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160280821691908281146145d5576145d5615a97565b67ffffffffffffffff81811683821601908082111561347e5761347e615a97565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615b1a57600080fd5b5051919050565b80820180821115612af957612af9615a97565b60008251615b46818460208701615a40565b9190910192915050565b600087516020615b638285838d01615a40565b885191840191615b768184848d01615a40565b8851920191615b888184848c01615a40565b8751920191615b9a8184848b01615a40565b8651920191615bac8184848a01615a40565b8551920191615bbe8184848901615a40565b919091019998505050505050505050565b60008351615be1818460208801615a40565b835190830190615bf5818360208801615a40565b01949350505050565b60008751615c10818460208c01615a40565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615c4c818460208901615a40565b845190830190615c60818360208901615a40565b8451910190615c73818360208801615a40565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615cb057634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115612af957612af9615a97565b60008551615cda818460208a01615a40565b855190830190615cee818360208a01615a40565b8551910190615d01818360208901615a40565b8451910190615d14818360208801615a40565b019695505050505050565b600089516020615d328285838f01615a40565b8a5191840191615d458184848f01615a40565b8a51920191615d578184848e01615a40565b8951920191615d698184848d01615a40565b8851920191615d7b8184848c01615a40565b8751920191615d8d8184848b01615a40565b8651920191615d9f8184848a01615a40565b8551920191615db18184848901615a40565b919091019b9a5050505050505050505050565b600088516020615dd78285838e01615a40565b895191840191615dea8184848e01615a40565b8951920191615dfc8184848d01615a40565b8851920191615e0e8184848c01615a40565b8751920191615e208184848b01615a40565b8651920191615e328184848a01615a40565b8551920191615e448184848901615a40565b919091019a9950505050505050505050565b60008a51615e68818460208f01615a40565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fea164736f6c6343000817000a"
+"0x60a0604052306080523480156200001557600080fd5b5060405162006471380380620064718339810160408190526200003891620004ec565b6200004262000056565b6200004e82826200010a565b5050620005bf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b81516001600160401b03161515806200012f575060208201516001600160401b031615155b806200013d57506080820151155b806200014b575060a0820151155b8062000159575060c0820151155b8062000167575060e0820151155b8062000177575063ffffffff8116155b1562000196576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff160217905550600062000384836200047260201b60201c565b600181815560e085015160028181556003939093556004556007805480830182556000918252437fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101556040805180820182526020808901516001600160401b039081168352929098015197810197885260088054948501815590925290517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39290930291820180546001600160401b031916939091169290921790915592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909301929092555050565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b80516001600160401b0381168114620004d257600080fd5b919050565b805163ffffffff81168114620004d257600080fd5b6000808284036101208112156200050257600080fd5b610100808212156200051357600080fd5b60405191508082016001600160401b03811183821017156200054557634e487b7160e01b600052604160045260246000fd5b6040526200055385620004ba565b82526200056360208601620004ba565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350620005b4818601620004d7565b925050509250929050565b608051615e88620005e9600039600081816116290152818161165201526117be0152615e886000f3fe60806040526004361061017e5760003560e01c8063013fa5fc146101835780630d8e6e2c146101a5578063202a0adb146101d7578063313df7b114610280578063382b215a146102ad5780633919340f146102d15780633949d1e9146102f1578063409939b7146103385780634847ae5d146103585780634f1ef286146103da57806352d1902d146103ed578063530ca78f146104025780635464608514610422578063628277331461043757806369cc6a041461044d5780637053fc5114610462578063715018a614610477578063766718081461048c57806376b6b7cb146104c05780637f17baad146104d657806382d07ff3146105895780638584d23f1461059e5780638da5cb5b146105e2578063a244d596146105f7578063a51e6fea14610617578063aa92273214610637578063ad3cb1cc14610657578063bd32519a14610695578063ca6fe855146106c6578063db13b60a146106dc578063e03033011461071b578063f06820541461073b578063f2fde38b1461076d575b600080fd5b34801561018f57600080fd5b506101a361019e366004615258565b61078d565b005b3480156101b157600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101e357600080fd5b506101a36101f23660046153b8565b6000805463ffffffff600160401b918290041682526005602081815260409384902085518154928701516001600160401b039081169095026001600160801b0319909316941693909317178255918301516001820155606083015160028201556080830151600382015560a0830151600482015560c08301519181019190915560e090910151600690910155565b34801561028c57600080fd5b506006546102a0906001600160a01b031681565b6040516101ce91906153d5565b3480156102b957600080fd5b506102c360035481565b6040519081526020016101ce565b3480156102dd57600080fd5b506101a36102ec36600461540c565b61084d565b3480156102fd57600080fd5b506101a361030c3660046154a1565b600080546001600160401b03909216600160601b02600160601b600160a01b0319909216919091179055565b34801561034457600080fd5b506101a36103533660046154ec565b610870565b34801561036457600080fd5b5061036d610b9b565b6040516101ce919060006101008201905060018060401b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101a36103e83660046156a6565b610c2d565b3480156103f957600080fd5b506102c3610c48565b34801561040e57600080fd5b506101a361041d36600461574b565b610c65565b34801561042e57600080fd5b506008546102c3565b34801561044357600080fd5b506102c360025481565b34801561045957600080fd5b506101a3610ce1565b34801561046e57600080fd5b506007546102c3565b34801561048357600080fd5b506101a3610d51565b34801561049857600080fd5b506000546104b390600160601b90046001600160401b031681565b6040516101ce91906157fc565b3480156104cc57600080fd5b506102c360015481565b3480156104e257600080fd5b506105436104f1366004615824565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006909501546001600160401b0380861697600160401b9096041695939492939192919088565b604080516001600160401b03998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101ce565b34801561059557600080fd5b5061036d610d63565b3480156105aa57600080fd5b506105be6105b936600461583f565b610df3565b6040805182516001600160401b0316815260209283015192810192909252016101ce565b3480156105ee57600080fd5b506102a0610f4d565b34801561060357600080fd5b506101a3610612366004615858565b610f68565b34801561062357600080fd5b506102c361063236600461583f565b611093565b34801561064357600080fd5b506102c36106523660046153b8565b6110b4565b34801561066357600080fd5b50610688604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101ce91906158c3565b3480156106a157600080fd5b506006546106b690600160a01b900460ff1681565b60405190151581526020016101ce565b3480156106d257600080fd5b506102c360045481565b3480156106e857600080fd5b506106fc6106f736600461583f565b6110fc565b604080516001600160401b0390931683526020830191909152016101ce565b34801561072757600080fd5b506106b66107363660046158f6565b611134565b34801561074757600080fd5b506000546107589063ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561077957600080fd5b506101a3610788366004615258565b611217565b610795611255565b6001600160a01b0381166107bc5760405163e6c4247b60e01b815260040160405180910390fd5b6006546001600160a01b03908116908216036107eb5760405163a863aec960e01b815260040160405180910390fd5b600680546001600160a81b0319166001600160a01b0380841691909117600160a01b17918290556040517f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072926108429216906153d5565b60405180910390a150565b61085960076000614f91565b805161086c906007906020840190614faf565b5050565b600654600160a01b900460ff16801561089457506006546001600160a01b03163314155b156108db576006546001600160a01b03166108c2576040516312e6d1e760e11b815260040160405180910390fd5b6040516301474c8f60e71b815260040160405180910390fd5b6108e3610d63565b5182516001600160401b0391821691161115806109215750610903610d63565b602001516001600160401b031682602001516001600160401b031611155b1561093f5760405163051c46ef60e01b815260040160405180910390fd5b600080546109649063ffffffff811690600160601b90046001600160401b031661592e565b6000805463ffffffff600160401b91829004168252600560205260409091205491925090046001600160401b03908116908216148015816109ba5750816001600160401b031684602001516001600160401b0316115b156109e3578160405163036466bf60e31b81526004016109da91906157fc565b60405180910390fd5b6109f08460400151611287565b6109fd8460600151611287565b610a0a8460800151611287565b610a178460a00151611287565b610a248460c00151611287565b8015610a3257610a326112e3565b610a3c848461142e565b60008054600160401b9081900463ffffffff168252600560208181526040808520895181548b850180516001600160401b039384166001600160801b0319909316929092179183169097021782558a8301805160018085019190915560608d015160028086019190915560808e0151600386015560a08e0151600486015560c08e01519785019790975560e08d015160069094019390935560078054808501825590895243600080516020615d5c8339815191529091015583518085018552875183168152815181870190815260088054958601815590995251600080516020615ddc8339815191529390960292830180546001600160401b031916968316969096179095559551600080516020615e1c83398151915290910155925188519251935193845284169391909116917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610ba3614ffa565b5060008054600160201b900463ffffffff1681526005602081815260409283902083516101008101855281546001600160401b038082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610c3561161e565b610c3e826116c3565b61086c82826116fa565b6000610c526117b3565b50600080516020615d9c83398151915290565b610c7160086000615051565b60005b815181101561086c576008828281518110610c9157610c91615951565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160401b0319166001600160401b039092169190911781559101519082015501610c74565b610ce9611255565b600654600160a01b900460ff1615610d3657600680546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610d59611255565b610d4f60006117fc565b610d6b614ffa565b506000805463ffffffff600160401b918290041682526005602081815260409384902084516101008101865281546001600160401b038082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b60408051808201909152600080825260208201526008805490610e17600183615967565b81548110610e2757610e27615951565b60009182526020909120600290910201546001600160401b03168310610e6057604051631856a49960e21b815260040160405180910390fd5b60005b81811015610ef5578360088281548110610e7f57610e7f615951565b60009182526020909120600290910201546001600160401b03161115610eed5760088181548110610eb257610eb2615951565b60009182526020918290206040805180820190915260029092020180546001600160401b031682526001015491810191909152949350505050565b600101610e63565b506008610f03600183615967565b81548110610f1357610f13615951565b60009182526020918290206040805180820190915260029092020180546001600160401b0316825260010154918101919091529392505050565b600080610f58611858565b546001600160a01b031692915050565b6000610f7261187c565b805490915060ff600160401b82041615906001600160401b0316600081158015610f995750825b90506000826001600160401b03166001148015610fb55750303b155b905081158015610fc3575080155b15610fe15760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561100a57845460ff60401b1916600160401b1785555b611013866118a0565b61101b6118b1565b60008054600160201b600160601b031916600160401b17905561103e88886118b9565b831561108957845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290611080906001906157fc565b60405180910390a15b5050505050505050565b600781815481106110a357600080fd5b600091825260209091200154905081565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b6008818154811061110c57600080fd5b6000918252602090912060029091020180546001909101546001600160401b03909116915082565b600754600090438411806111485750600381105b156111665760405163b0b4387760e01b815260040160405180910390fd5b60008080611175600185615967565b90505b816111e057866007828154811061119157611191615951565b9060005260206000200154116111c65760019150600781815481106111b8576111b8615951565b906000526020600020015492505b600281106111e057806111d88161597a565b915050611178565b816111fe5760405163b0b4387760e01b815260040160405180910390fd5b856112098489615967565b119450505050505b92915050565b61121f611255565b6001600160a01b038116611249576000604051631e4fbdf760e01b81526004016109da91906153d5565b611252816117fc565b50565b3361125e610f4d565b6001600160a01b031614610d4f573360405163118cdaa760e01b81526004016109da91906153d5565b600080516020615dbc83398151915281108061086c5760405162461bcd60e51b815260206004820152601b60248201527a109b8c8d4d0e881a5b9d985b1a59081cd8d85b185c88199a595b19602a1b60448201526064016109da565b6000805463ffffffff600160401b9182900416825260056020818152604080852081516101008101835281546001600160401b038082168352969004909516928501929092526001820154908401526002810154606084015260038101546080840152600481015460a08401529081015460c08301526006015460e082015261136b906110b4565b600380546001908155908290556004805460025560008054600160401b810463ffffffff16825260056020526040822060060154909255929350909190600c906113c6908490600160601b90046001600160401b0316615991565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f6000600c9054906101000a90046001600160401b031660405161084291906157fc565b6000611438611bdc565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061147757611477615951565b60200260200101818152505083600001516001600160401b0316816001815181106114a4576114a4615951565b60200260200101818152505083602001516001600160401b0316816002815181106114d1576114d1615951565b6020026020010181815250508360400151816003815181106114f5576114f5615951565b60200260200101818152505083606001518160048151811061151957611519615951565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902060030154825190918391811061155d5761155d615951565b60209081029190910181019190915260008054600160401b900463ffffffff168152600590915260409020600401548151829060069081106115a1576115a1615951565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902001548151829060079081106115e4576115e4615951565b6020026020010181815250506115fb8282856121bd565b611618576040516309bde33960e01b815260040160405180910390fd5b50505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806116a557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611699600080516020615d9c833981519152546001600160a01b031690565b6001600160a01b031614155b15610d4f5760405163703e46dd60e11b815260040160405180910390fd5b6116cb611255565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d8160405161084291906153d5565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611754575060408051601f3d908101601f19168201909252611751918101906159b1565b60015b6117735781604051634c9c8ce360e01b81526004016109da91906153d5565b600080516020615d9c83398151915281146117a457604051632a87526960e21b8152600481018290526024016109da565b6117ae83836122a8565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d4f5760405163703e46dd60e11b815260040160405180910390fd5b6000611806611858565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6118a86122fe565b61125281612323565b610d4f6122fe565b81516001600160401b03161515806118dd575060208201516001600160401b031615155b806118ea57506080820151155b806118f7575060a0820151155b80611904575060c0820151155b80611911575060e0820151155b80611920575063ffffffff8116155b1561193e576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff1602179055506000611b24836110b4565b600181815560e08501516002818155600393909355600455600780548083018255600091825243600080516020615d5c833981519152909101556040805180820182526020808901516001600160401b03908116835292909801519781019788526008805494850181559092529051600080516020615ddc8339815191529290930291820180546001600160401b03191693909116929092179091559251600080516020615e1c833981519152909301929092555050565b611be4615072565b620100008152600860208201527f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee816040820151527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b6020604083015101527f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d6060820151527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c6020606083015101527f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac86080820151527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d36020608083015101527f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c83960a0820151527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea602060a083015101527f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce760c0820151527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b6602060c083015101527f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a660e0820151527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d602060e083015101527f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f610100820151527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b602061010083015101527f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e08610120820151527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c14602061012083015101527f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e7610140820151527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba602061014083015101527f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba655022610160820151527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f602061016083015101527f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df2610180820151527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e602061018083015101527f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f76101a0820151527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b60206101a083015101527f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec736101c0820151527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc2860206101c083015101527f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508036101e0820151527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d4569091582460206101e083015101527f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a610200820151527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf602061020083015101527f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db44610220820151527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab602061022083015101527f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a75610240820151527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be1602061024083015101527f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9610260820151527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab3706020610260830151015290565b60006121c88261232b565b6121eb836000815181106121de576121de615951565b6020026020010151611287565b612201836001815181106121de576121de615951565b612217836002815181106121de576121de615951565b61222d836003815181106121de576121de615951565b612243836004815181106121de576121de615951565b612259836005815181106121de576121de615951565b61226f836006815181106121de576121de615951565b612285836007815181106121de576121de615951565b6000612292858585612463565b905061229d816125ad565b9150505b9392505050565b6122b182612a0c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156122f6576117ae8282612a68565b61086c612ade565b612306612afd565b610d4f57604051631afcd79f60e31b815260040160405180910390fd5b61121f6122fe565b805161233690612b17565b6123438160200151612b17565b6123508160400151612b17565b61235d8160600151612b17565b61236a8160800151612b17565b6123778160a00151612b17565b6123848160c00151612b17565b6123918160e00151612b17565b61239f816101000151612b17565b6123ad816101200151612b17565b6123bb816101400151612b17565b6123c9816101600151612b17565b6123d7816101800151612b17565b6123e5816101a00151611287565b6123f3816101c00151611287565b612401816101e00151611287565b61240f816102000151611287565b61241d816102200151611287565b61242b816102400151611287565b612439816102600151611287565b612447816102800151611287565b612455816102a00151611287565b611252816102c00151611287565b61246b615176565b8360200151835114612490576040516320fa9d8960e11b815260040160405180910390fd5b600061249d858585612ba5565b905060006124ae8660000151612ec4565b905060006124c1828460a001518861328f565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b61250c6151b0565b81526020019060019003908161250457905050905060006125318a858a8987876132ef565b60a0870151606087015191925090600080516020615dbc833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6000600080516020615dbc8339815191526125c66151b0565b6125ce6151b0565b6040805160028082526060820183526000926020830190803683375050604080516002808252606082019092529293506000929150602082015b6126106151b0565b815260200190600190039081612608579050509050600060019050808360008151811061263f5761263f615951565b6020026020010181815250508760c001518260008151811061266357612663615951565b602002602001018190525087600001518360018151811061268657612686615951565b6020026020010181815250508760e00151826001815181106126aa576126aa615951565b60200260200101819052506126bf8284613324565b60808901515190955060609350839250905060006126de8260026159ca565b6126e99060016159ca565b9050806001600160401b0381111561270357612703615273565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b509350806001600160401b0381111561274757612747615273565b60405190808252806020026020018201604052801561278057816020015b61276d6151b0565b8152602001906001900390816127655790505b509250505060008060005b89608001515181101561282457896080015181815181106127ae576127ae615951565b60200260200101518583815181106127c8576127c8615951565b6020026020010181815250508960a0015181815181106127ea576127ea615951565b602002602001015184838151811061280457612804615951565b602090810291909101015261281a6001836159ca565b915060010161278b565b50886020015184828151811061283c5761283c615951565b6020026020010181815250508860c0015183828151811061285f5761285f615951565b60209081029190910101526128756001826159ca565b895160408b01519192509060008982840990508087858151811061289b5761289b615951565b6020026020010181815250505050508860e001518382815181106128c1576128c1615951565b60209081029190910101526128d76001826159ca565b60608a0151909150878184089250506128ef82613412565b84828151811061290157612901615951565b602002602001018181525050612915613444565b83828151811061292757612927615951565b602002602001018190525061294461293f8486613324565b613465565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe48152509050612a028382846129fd6134d2565b6135a3565b9695505050505050565b806001600160a01b03163b600003612a395780604051634c9c8ce360e01b81526004016109da91906153d5565b600080516020615d9c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612a8591906159dd565b600060405180830381855af49150503d8060008114612ac0576040519150601f19603f3d011682016040523d82523d6000602084013e612ac5565b606091505b5091509150612ad5858383613686565b95945050505050565b3415610d4f5760405163b398979f60e01b815260040160405180910390fd5b6000612b0761187c565b54600160401b900460ff16919050565b6000600080516020615d3c833981519152612b31836136d9565b15612b3b57505050565b8251602084015182600384858586098509088382830914838210848410161693505050816117ae5760405162461bcd60e51b8152602060048201526017602482015276109b8c8d4d0e881a5b9d985b1a590811cc481c1bda5b9d604a1b60448201526064016109da565b612bed60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080518082019091526060815260006020820152600080516020615dbc833981519152612c1c8287876136e8565b81518451612c2990613a81565b612c368660200151613a81565b612c438760400151613a81565b612c508860600151613a81565b612c5d8960800151613a81565b604051602001612c72969594939291906159f9565b60408051601f198184030181529190528252612c8d82613af6565b50612c9782613af6565b6060840152612ca582613af6565b6080840152815160a0850151612cba90613a81565b604051602001612ccb929190615a78565b60408051601f198184030181529190528252612ce682613af6565b8352815160c0850151612cf890613a81565b612d058660e00151613a81565b612d13876101000151613a81565b612d21886101200151613a81565b612d2f896101400151613a81565b604051602001612d44969594939291906159f9565b60408051601f198184030181529190528252612d5f82613af6565b60a084015281516101a0850151612d7590613b58565b612d83866101c00151613b58565b612d91876101e00151613b58565b612d9f886102000151613b58565b612dad896102200151613b58565b604051602001612dc296959493929190615aa7565b60408051601f19818403018152919052808352610240850151612de490613b58565b612df2866102600151613b58565b612e00876102800151613b58565b612e0e886102a00151613b58565b612e1c896102c00151613b58565b604051602001612e3196959493929190615aa7565b60408051601f198184030181529190528252612e4c82613af6565b60c08401528151610160850151612e6290613a81565b612e70866101800151613a81565b604051602001612e8293929190615ae3565b60408051601f198184030181529190528252612e9d82613af6565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612ef66040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612f8a57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b81620200000361301f57506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b8162040000036130b457506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b81620800000361314957506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b8162100000036131de57506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b8160200361327157506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b60405163e2ef09e560e01b815260040160405180910390fd5b919050565b6132b360405180606001604052806000815260200160008152602001600081525090565b6132bd8484613c8f565b8082526132cd9085908590613ce3565b602082015280516132e390859084908690613d57565b60408201529392505050565b6000806132fd858789613f0b565b905061330d888689898888613ff7565b613318818786614303565b98975050505050505050565b61332c6151b0565b825182511461337d5760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d6174636860448201526064016109da565b6133bb8360008151811061339357613393615951565b6020026020010151836000815181106133ae576133ae615951565b6020026020010151614353565b905060015b825181101561340b57613401826133fc8684815181106133e2576133e2615951565b60200260200101518685815181106133ae576133ae615951565b6143e7565b91506001016133c0565b5092915050565b600061342c600080516020615dbc83398151915283615b3c565b61121190600080516020615dbc833981519152615967565b61344c6151b0565b5060408051808201909152600181526002602082015290565b61346d6151b0565b613476826136d9565b1561347f575090565b604051806040016040528083600001518152602001600080516020615d3c83398151915284602001516134b29190615b3c565b6134ca90600080516020615d3c833981519152615967565b905292915050565b6134fd6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806136785760405162461bcd60e51b815260206004820152601c60248201527b426e3235343a2050616972696e6720636865636b206661696c65642160201b60448201526064016109da565b50151590505b949350505050565b60608261369b5761369682614482565b6122a1565b81511580156136b257506001600160a01b0384163b155b156136d25783604051639996b31560e01b81526004016109da91906153d5565b50806122a1565b80516020909101511590151690565b825160fe906137236136f983613b58565b60405160200161370b91815260200190565b604051602081830303815290604052600060046144ab565b61375d6137338660000151613b58565b60405160200161374591815260200190565b604051602081830303815290604052600060086144ab565b61376d6137338760200151613b58565b6040516020016137809493929190615b5e565b60408051601f1981840301815291905280855261379d6001613b58565b6137b4600080516020615e5c833981519152613b58565b6137cb600080516020615dfc833981519152613b58565b6137e2600080516020615e3c833981519152613b58565b6137f9600080516020615d7c833981519152613b58565b60405160200161380e96959493929190615aa7565b60408051601f1981840301815291905280855260e084015161382f90613a81565b61383d856101000151613a81565b61384b866101200151613a81565b613859876101400151613a81565b613867886101600151613a81565b613875896101800151613a81565b6138838a6101e00151613a81565b60405160200161389a989796959493929190615bb5565b60408051601f198184030181529190528085526102008401516138bc90613a81565b6138ca856102200151613a81565b6138d8866102400151613a81565b6138e6876101a00151613a81565b6138f4886101c00151613a81565b613902896102600151613a81565b6040516020016139189796959493929190615c5a565b60408051601f1981840301815291815281865284015161393790613a81565b6139448560600151613a81565b6139518660800151613a81565b61395e8760a00151613a81565b61396b8860c00151613a81565b604051602001613980969594939291906159f9565b60408051601f1981840301815291905280855282516139b79084906000906139aa576139aa615951565b6020026020010151613b58565b6139cd846001815181106139aa576139aa615951565b6139e3856002815181106139aa576139aa615951565b6139f9866003815181106139aa576139aa615951565b613a0f876004815181106139aa576139aa615951565b613a25886005815181106139aa576139aa615951565b613a3b896006815181106139aa576139aa615951565b613a518a6007815181106139aa576139aa615951565b604051602001613a6999989796959493929190615cec565b60408051601f19818403018152919052909352505050565b60606000613a8e836136d9565b15613a9a57600160fe1b175b6020830151600080516020615d3c83398151915260019190911b10613ac05750600160ff1b5b8251613acd908217613b58565b604051602001613adf91815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613b2d5760208186018101518383015201613b13565b50506020918201902090860181905292506000612a02600080516020615dbc83398151915285615b3c565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1916901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1916901c1790506040816001600160401b03600160801b03600160c01b0316901b6040826001600160401b03600160801b03600160c01b031916901c179050608081901b608082901c179050919050565b8151600090600080516020615dbc83398151915290838015613cd35784935060005b82811015613cc757838586099450600101613cb1565b50600184039350613cda565b6001830393505b50505092915050565b600082600103613cf5575060016122a1565b81600003613d05575060006122a1565b6040840151600080516020615dbc83398151915290600090828186099050858015613d3557600187039250613d3c565b6001840392505b50613d46826145b8565b915082828209979650505050505050565b8251600090600080516020615dbc83398151915290838303613dd857600160005b82811015613dcb57818703613dac57878181518110613d9957613d99615951565b602002602001015194505050505061367e565b8380613dba57613dba615b26565b896060015183099150600101613d78565b506000935050505061367e565b6000806000808a604001519050600080613df28d8861465e565b90506000876001600160401b03811115613e0e57613e0e615273565b604051908082528060200260200182016040528015613e37578160200160208202803683370190505b509050888b850993506001925060005b88811015613e7c57602081026020840101519550898d878c030896508987850960208281028401018890529350600101613e47565b50613e86836145b8565b925060005b88811015613ef95760208102602084010151955089868609975089848909975060005b89811015613ed857808214613ed0576020810260208401015197508a888a0998505b600101613eae565b506020810260208f010151955089868909975089888c089a50600101613e8b565b50505050505050505050949350505050565b600080600080516020615dbc8339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b614005868686868587614723565b60c08501518251600080516020615dbc8339815191529190819081908690601490811061403457614034615951565b60200260200101818152505085600001518460148151811061405857614058615951565b6020026020010181905250828282099050808560158151811061407d5761407d615951565b6020026020010181815250508560200151846015815181106140a1576140a1615951565b602002602001018190525082828209905080856016815181106140c6576140c6615951565b6020026020010181815250508560400151846016815181106140ea576140ea615951565b6020026020010181905250828282099050808560178151811061410f5761410f615951565b60200260200101818152505085606001518460178151811061413357614133615951565b6020026020010181905250828282099050808560188151811061415857614158615951565b60200260200101818152505085608001518460188151811061417c5761417c615951565b602002602001018190525082828209905080856019815181106141a1576141a1615951565b6020026020010181815250508860400151846019815181106141c5576141c5615951565b60200260200101819052508282820990508085601a815181106141ea576141ea615951565b602002602001018181525050886060015184601a8151811061420e5761420e615951565b60200260200101819052508282820990508085601b8151811061423357614233615951565b602002602001018181525050886080015184601b8151811061425757614257615951565b60200260200101819052508282820990508085601c8151811061427c5761427c615951565b6020026020010181815250508860a0015184601c815181106142a0576142a0615951565b60200260200101819052508282820990508760e0015185601d815181106142c9576142c9615951565b6020026020010181815250508560a0015184601d815181106142ed576142ed615951565b6020026020010181905250505050505050505050565b600080516020615dbc8339815191528381039060005b600a81101561434a5760206015820102840151602082026101a0018601518384828409860894505050600101614319565b50509392505050565b61435b6151b0565b6143636151ca565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061439557600080fd5b50806143df5760405162461bcd60e51b8152602060048201526019602482015278426e3235343a207363616c6172206d756c206661696c65642160381b60448201526064016109da565b505092915050565b6143ef6151b0565b6143f76151e8565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061443457600080fd5b50806143df5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c65642100000060448201526064016109da565b8051156144925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6060816144b981601f6159ca565b10156144f85760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016109da565b61450282846159ca565b845110156145465760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016109da565b60608215801561456557604051915060008252602082016040526145af565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561459e578051835260209283019201614586565b5050858452601f01601f1916604052505b50949350505050565b6000806000600080516020615dbc833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816146575760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016109da565b5050919050565b6060826020015182111561468557604051638c5e11f160e01b815260040160405180910390fd5b60608301516001600080516020615dbc833981519152846001600160401b038111156146b3576146b3615273565b6040519080825280602002602001820160405280156146dc578160200160208202803683370190505b50935084151915613cda5760208401856020028101600182526020820191505b80821015614718578285850993508382526020820191506146fc565b505050505092915050565b600080600080600080600080516020615dbc83398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c01518308915080848309935080600080516020615e5c83398151915284099150806101c08a0151830891508060808c01518308915080848309935080600080516020615dfc83398151915284099150806101e08a0151830891508060808c01518308915080848309935080600080516020615e3c83398151915284099150806102008a0151830891508060808c01518308915080848309935080600080516020615d7c83398151915284099150806102208a0151830891508060808c0151830891508084830993508084870895508860a001518860008151811061485257614852615951565b6020026020010181905250858760008151811061487157614871615951565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c001518860018151811061495357614953615951565b60209081029190910101526149688582615967565b8760018151811061497b5761497b615951565b602002602001018181525050886101a00151876002815181106149a0576149a0615951565b602002602001018181525050886101c00151876003815181106149c5576149c5615951565b602002602001018181525050886101e00151876004815181106149ea576149ea615951565b60200260200101818152505088610200015187600581518110614a0f57614a0f615951565b6020026020010181815250508b60e0015188600281518110614a3357614a33615951565b60200260200101819052508b610100015188600381518110614a5757614a57615951565b60200260200101819052508b610120015188600481518110614a7b57614a7b615951565b60200260200101819052508b610140015188600581518110614a9f57614a9f615951565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614ace57614ace615951565b6020026020010181815250508b610160015188600681518110614af357614af3615951565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614b2257614b22615951565b6020026020010181815250508b610180015188600781518110614b4757614b47615951565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614b8057614b80615951565b6020026020010181815250508b6101e0015188600881518110614ba557614ba5615951565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614bde57614bde615951565b6020026020010181815250508b610200015188600981518110614c0357614c03615951565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614c3c57614c3c615951565b6020026020010181815250508b610220015188600a81518110614c6157614c61615951565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614c9a57614c9a615951565b6020026020010181815250508b610240015188600b81518110614cbf57614cbf615951565b602002602001018190525088610220015181614cdb9190615967565b87600c81518110614cee57614cee615951565b6020026020010181815250508b6101a0015188600c81518110614d1357614d13615951565b6020026020010181905250600187600d81518110614d3357614d33615951565b6020026020010181815250508b6101c0015188600d81518110614d5857614d58615951565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614da857614da8615951565b6020026020010181815250508b610260015188600e81518110614dcd57614dcd615951565b60209081029190910101528951614de49082615967565b87600f81518110614df757614df7615951565b6020026020010181815250508860c0015188600f81518110614e1b57614e1b615951565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110614e6157614e61615951565b6020026020010181815250508860e0015188601081518110614e8557614e85615951565b6020026020010181905250808360206011028901510991508187601181518110614eb157614eb1615951565b60200260200101818152505088610100015188601181518110614ed657614ed6615951565b6020026020010181905250808360206012028901510991508187601281518110614f0257614f02615951565b60200260200101818152505088610120015188601281518110614f2757614f27615951565b6020026020010181905250808360206013028901510991508187601381518110614f5357614f53615951565b60200260200101818152505088610140015188601381518110614f7857614f78615951565b6020026020010181905250505050505050505050505050565b50805460008255906000526020600020908101906112529190615206565b828054828255906000526020600020908101928215614fea579160200282015b82811115614fea578251825591602001919060010190614fcf565b50614ff6929150615206565b5090565b60405180610100016040528060006001600160401b0316815260200160006001600160401b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5080546000825560020290600052602060002090810190611252919061521b565b60405180610280016040528060008152602001600081526020016150946151b0565b81526020016150a16151b0565b81526020016150ae6151b0565b81526020016150bb6151b0565b81526020016150c86151b0565b81526020016150d56151b0565b81526020016150e26151b0565b81526020016150ef6151b0565b81526020016150fc6151b0565b81526020016151096151b0565b81526020016151166151b0565b81526020016151236151b0565b81526020016151306151b0565b815260200161513d6151b0565b815260200161514a6151b0565b81526020016151576151b0565b81526020016151646151b0565b81526020016151716151b0565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016151645b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b5b80821115614ff65760008155600101615207565b5b80821115614ff65780546001600160401b03191681556000600182015560020161521c565b80356001600160a01b038116811461328a57600080fd5b60006020828403121561526a57600080fd5b6122a182615241565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156152ab576152ab615273565b60405290565b6040516102e081016001600160401b03811182821017156152ab576152ab615273565b604051601f8201601f191681016001600160401b03811182821017156152fc576152fc615273565b604052919050565b80356001600160401b038116811461328a57600080fd5b600061010080838503121561532f57600080fd5b604051908101906001600160401b038211818310171561535157615351615273565b8160405280925061536184615304565b815261536f60208501615304565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b600061010082840312156153cb57600080fd5b6122a1838361531b565b6001600160a01b0391909116815260200190565b60006001600160401b0382111561540257615402615273565b5060051b60200190565b6000602080838503121561541f57600080fd5b82356001600160401b0381111561543557600080fd5b8301601f8101851361544657600080fd5b8035615459615454826153e9565b6152d4565b81815260059190911b8201830190838101908783111561547857600080fd5b928401925b828410156154965783358252928401929084019061547d565b979650505050505050565b6000602082840312156154b357600080fd5b6122a182615304565b6000604082840312156154ce57600080fd5b6154d6615289565b9050813581526020820135602082015292915050565b60008082840361058081121561550157600080fd5b61550b858561531b565b92506101006104808060ff198401121561552457600080fd5b61552c6152b1565b925061553a878388016154bc565b835261014061554b888289016154bc565b602085015261018061555f89828a016154bc565b60408601526101c06155738a828b016154bc565b60608701526102006155878b828c016154bc565b608088015261024061559b8c828d016154bc565b60a08901526102806155af8d828e016154bc565b60c08a01526102c06155c38e828f016154bc565b60e08b01526155d68e6103008f016154bc565b898b01526155e88e6103408f016154bc565b6101208b01526155fc8e6103808f016154bc565b878b015261560e8e6103c08f016154bc565b6101608b01526156228e6104008f016154bc565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b600080604083850312156156b957600080fd5b6156c283615241565b91506020838101356001600160401b03808211156156df57600080fd5b818601915086601f8301126156f357600080fd5b81358181111561570557615705615273565b615717601f8201601f191685016152d4565b9150808252878482850101111561572d57600080fd5b80848401858401376000848284010152508093505050509250929050565b6000602080838503121561575e57600080fd5b82356001600160401b0381111561577457600080fd5b8301601f8101851361578557600080fd5b8035615793615454826153e9565b81815260069190911b820183019083810190878311156157b257600080fd5b928401925b8284101561549657604084890312156157d05760008081fd5b6157d8615289565b6157e185615304565b815284860135868201528252604090930192908401906157b7565b6001600160401b0391909116815260200190565b803563ffffffff8116811461328a57600080fd5b60006020828403121561583657600080fd5b6122a182615810565b60006020828403121561585157600080fd5b5035919050565b6000806000610140848603121561586e57600080fd5b615878858561531b565b92506158876101008501615810565b91506158966101208501615241565b90509250925092565b60005b838110156158ba5781810151838201526020016158a2565b50506000910152565b60208152600082518060208401526158e281604085016020870161589f565b601f01601f19169190910160400192915050565b6000806040838503121561590957600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160280821691908281146143df576143df615918565b634e487b7160e01b600052603260045260246000fd5b8181038181111561121157611211615918565b60008161598957615989615918565b506000190190565b6001600160401b0381811683821601908082111561340b5761340b615918565b6000602082840312156159c357600080fd5b5051919050565b8082018082111561121157611211615918565b600082516159ef81846020870161589f565b9190910192915050565b600087516020615a0c8285838d0161589f565b885191840191615a1f8184848d0161589f565b8851920191615a318184848c0161589f565b8751920191615a438184848b0161589f565b8651920191615a558184848a0161589f565b8551920191615a67818484890161589f565b919091019998505050505050505050565b60008351615a8a81846020880161589f565b835190830190615a9e81836020880161589f565b01949350505050565b60008751615ab9818460208c0161589f565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615af581846020890161589f565b845190830190615b0981836020890161589f565b8451910190615b1c81836020880161589f565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615b5957634e487b7160e01b600052601260045260246000fd5b500690565b60008551615b70818460208a0161589f565b855190830190615b84818360208a0161589f565b8551910190615b9781836020890161589f565b8451910190615baa81836020880161589f565b019695505050505050565b600089516020615bc88285838f0161589f565b8a5191840191615bdb8184848f0161589f565b8a51920191615bed8184848e0161589f565b8951920191615bff8184848d0161589f565b8851920191615c118184848c0161589f565b8751920191615c238184848b0161589f565b8651920191615c358184848a0161589f565b8551920191615c47818484890161589f565b919091019b9a5050505050505050505050565b600088516020615c6d8285838e0161589f565b895191840191615c808184848e0161589f565b8951920191615c928184848d0161589f565b8851920191615ca48184848c0161589f565b8751920191615cb68184848b0161589f565b8651920191615cc88184848a0161589f565b8551920191615cda818484890161589f565b919091019a9950505050505050505050565b60008a51615cfe818460208f0161589f565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6882e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee31ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee42042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4aa164736f6c6343000817000a"
diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json
index 70a55867e..ecc8c2165 100644
--- a/contract-bindings/artifacts/LightClient_bytecode.json
+++ b/contract-bindings/artifacts/LightClient_bytecode.json
@@ -1 +1 @@
-"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615d9b62000104600039600081816113d0015281816113f901526115e70152615d9b6000f3fe6080604052600436106101805760003560e01c806376671808116100d6578063aa9227321161007f578063ca6fe85511610059578063ca6fe855146105c8578063f0682054146105de578063f2fde38b1461061057600080fd5b8063aa922732146104cd578063ad3cb1cc14610530578063bd32519a1461058657600080fd5b806382d07ff3116100b057806382d07ff31461045b5780638da5cb5b14610470578063a244d596146104ad57600080fd5b8063766718081461034157806376b6b7cb1461038b5780637f17baad146103a157600080fd5b80634847ae5d116101385780636282773311610112578063628277331461030157806369cc6a0414610317578063715018a61461032c57600080fd5b80634847ae5d146102555780634f1ef286146102d957806352d1902d146102ec57600080fd5b8063313df7b111610169578063313df7b1146101d9578063382b215a14610211578063409939b71461023557600080fd5b8063013fa5fc146101855780630d8e6e2c146101a7575b600080fd5b34801561019157600080fd5b506101a56101a0366004615487565b610630565b005b3480156101b357600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101e557600080fd5b506006546101f9906001600160a01b031681565b6040516001600160a01b0390911681526020016101d0565b34801561021d57600080fd5b5061022760035481565b6040519081526020016101d0565b34801561024157600080fd5b506101a5610250366004615618565b610748565b34801561026157600080fd5b5061026a610a8a565b6040516101d0919060006101008201905067ffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101a56102e73660046157f0565b610b77565b3480156102f857600080fd5b50610227610b96565b34801561030d57600080fd5b5061022760025481565b34801561032357600080fd5b506101a5610bc5565b34801561033857600080fd5b506101a5610c77565b34801561034d57600080fd5b50600054610372906c01000000000000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101d0565b34801561039757600080fd5b5061022760015481565b3480156103ad57600080fd5b506104146103bc3660046158aa565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460069095015467ffffffffffffffff80861697680100000000000000009096041695939492939192919088565b6040805167ffffffffffffffff998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101d0565b34801561046757600080fd5b5061026a610c89565b34801561047c57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f9565b3480156104b957600080fd5b506101a56104c83660046158c5565b610d73565b3480156104d957600080fd5b506102276104e836600461590c565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b34801561053c57600080fd5b506105796040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d0919061594d565b34801561059257600080fd5b506006546105b89074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101d0565b3480156105d457600080fd5b5061022760045481565b3480156105ea57600080fd5b506000546105fb9063ffffffff1681565b60405163ffffffff90911681526020016101d0565b34801561061c57600080fd5b506101a561062b366004615487565b610f0e565b610638610f65565b6001600160a01b038116610678576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b03908116908216036106c0576040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffff000000000000000000000000000000000000000000166001600160a01b0383811691909117740100000000000000000000000000000000000000001791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60065474010000000000000000000000000000000000000000900460ff16801561077d57506006546001600160a01b03163314155b156107f6576006546001600160a01b03166107c4576040517f25cda3ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3a6478000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fe610c89565b51825167ffffffffffffffff918216911611158061083f575061081f610c89565b6020015167ffffffffffffffff16826020015167ffffffffffffffff1611155b15610876576040517f051c46ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546108a59063ffffffff8116906c01000000000000000000000000900467ffffffffffffffff16615996565b6000805463ffffffff68010000000000000000918290041682526005602052604090912054919250900467ffffffffffffffff9081169082161480158161090357508167ffffffffffffffff16846020015167ffffffffffffffff16115b1561094b576040517f1b2335f800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024015b60405180910390fd5b6109588460400151610fd9565b6109658460600151610fd9565b6109728460800151610fd9565b61097f8460a00151610fd9565b61098c8460c00151610fd9565b801561099a5761099a611049565b6109a484846111ab565b6000805463ffffffff680100000000000000009182900416825260056020818152604093849020885181548a84015167ffffffffffffffff9081169687027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169216918217178255898601516001830181905560608b0151600284015560808b0151600384015560a08b0151600484015560c08b01519483019490945560e08a015160069092019190915593519182529192917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610ae6604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060008054640100000000900463ffffffff16815260056020818152604092839020835161010081018552815467ffffffffffffffff80821683526801000000000000000090910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610b7f6113c5565b610b8882611495565b610b9282826114d6565b5050565b6000610ba06115dc565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610bcd610f65565b60065474010000000000000000000000000000000000000000900460ff1615610c4357600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b6040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610c7f610f65565b610c75600061163e565b610ce5604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000805463ffffffff680100000000000000009182900416825260056020818152604093849020845161010081018652815467ffffffffffffffff8082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610dbe5750825b905060008267ffffffffffffffff166001148015610ddb5750303b155b905081158015610de9575080155b15610e20576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610e6b57845468ff00000000000000001916680100000000000000001785555b610e74866116c7565b610e7c6116d8565b600080547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1668010000000000000000179055610eb988886116e0565b8315610f0457845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610f16610f65565b6001600160a01b038116610f59576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610942565b610f628161163e565b50565b33610f977f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c75576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610942565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811080610b925760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610942565b600080546801000000000000000080820463ffffffff16808452600560208181526040808720815161010081018352815467ffffffffffffffff808216835297900487168185015260018083015482850152600280840154606080850191909152600380860154608080870182905260048089015460a08901819052898d015460c08a018190526006909a01805460e0909a01999099528a51808d0194909452838b015282850198909852885180830390940184520190965280519087012085548355948590558354905595895293909252915490559390929091600c916111439185916c010000000000000000000000009004166159ba565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556000546040516c0100000000000000000000000090910490911681527fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f915060200161073d565b60006111b56119d0565b6040805160088082526101208201909252919250600091906020820161010080368337019050509050600254816000815181106111f4576111f46159db565b602002602001018181525050836000015167ffffffffffffffff1681600181518110611222576112226159db565b602002602001018181525050836020015167ffffffffffffffff1681600281518110611250576112506159db565b602002602001018181525050836040015181600381518110611274576112746159db565b602002602001018181525050836060015181600481518110611298576112986159db565b6020908102919091018101919091526000805468010000000000000000900463ffffffff168152600591829052604090206003015482519091839181106112e1576112e16159db565b6020908102919091018101919091526000805468010000000000000000900463ffffffff1681526005909152604090206004015481518290600690811061132a5761132a6159db565b6020908102919091018101919091526000805468010000000000000000900463ffffffff168152600591829052604090200154815182906007908110611372576113726159db565b602002602001018181525050611389828285611fb2565b6113bf576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061145e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149d610f65565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161073d565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611530575060408051601f3d908101601f1916820190925261152d918101906159f1565b60015b611571576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610942565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146115cd576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610942565b6115d7838361209d565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6116cf6120f3565b610f628161215a565b610c756120f3565b815167ffffffffffffffff161515806117065750602082015167ffffffffffffffff1615155b8061171357506080820151155b80611720575060a0820151155b8061172d575060c0820151155b8061173a575060e0820151155b80611749575063ffffffff8116155b15611780576040517fa1ba07ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550806000806101000a81548163ffffffff021916908363ffffffff16021790555060006119b38360808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b600181905560e09093015160028190556003939093555050600455565b6119d8615163565b621000008152600860208201527f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b336040820151527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c6020604083015101527f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db6060820151527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e9706020606083015101527f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b996080820151527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d6020608083015101527f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a580662560a0820151527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df60093602060a083015101527f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a960c0820151527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde28602060c083015101527f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b5969360e0820151527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc03602060e083015101527f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e7610100820151527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad602061010083015101527f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e4610120820151527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea17031602061012083015101527f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae7248610140820151527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db7036602061014083015101527f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e5619610160820151527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e8415602061016083015101527f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc8610180820151527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a3602061018083015101527f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc6101a0820151527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c60206101a083015101527f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b406101c0820151527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd560206101c083015101527f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc56101e0820151527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd360206101e083015101527f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa4610200820151527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc602061020083015101527f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a29782226610220820151527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e602061022083015101527f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab2614239610240820151527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd4602061024083015101527f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82610260820151527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d56020610260830151015290565b6000611fbd82612162565b611fe083600081518110611fd357611fd36159db565b6020026020010151610fd9565b611ff683600181518110611fd357611fd36159db565b61200c83600281518110611fd357611fd36159db565b61202283600381518110611fd357611fd36159db565b61203883600481518110611fd357611fd36159db565b61204e83600581518110611fd357611fd36159db565b61206483600681518110611fd357611fd36159db565b61207a83600781518110611fd357611fd36159db565b600061208785858561229a565b90506120928161241b565b9150505b9392505050565b6120a6826128e3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156120eb576115d7828261298b565b610b92612a03565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610c75576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f166120f3565b805161216d90612a3b565b61217a8160200151612a3b565b6121878160400151612a3b565b6121948160600151612a3b565b6121a18160800151612a3b565b6121ae8160a00151612a3b565b6121bb8160c00151612a3b565b6121c88160e00151612a3b565b6121d6816101000151612a3b565b6121e4816101200151612a3b565b6121f2816101400151612a3b565b612200816101600151612a3b565b61220e816101800151612a3b565b61221c816101a00151610fd9565b61222a816101c00151610fd9565b612238816101e00151610fd9565b612246816102000151610fd9565b612254816102200151610fd9565b612262816102400151610fd9565b612270816102600151610fd9565b61227e816102800151610fd9565b61228c816102a00151610fd9565b610f62816102c00151610fd9565b6122a26153e1565b83602001518351146122e0576040517f41f53b1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122ed858585612ae5565b905060006122fe8660000151612e16565b90506000612311828460a00151886131fa565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b6040805180820190915260008082526020820152815260200190600190039081612354579050509050600061238d8a858a89878761325a565b60a08701516060870151919250907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6040805180820182526000808252602080830182905283518085018552828152908101829052835160028082526060820190955291937f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001939285918160200160208202803683375050604080516002808252606082019092529293506000929150602082015b60408051808201909152600080825260208201528152602001906001900390816124a157905050905060006001905080836000815181106124e4576124e46159db565b6020026020010181815250508760c0015182600081518110612508576125086159db565b602002602001018190525087600001518360018151811061252b5761252b6159db565b6020026020010181815250508760e001518260018151811061254f5761254f6159db565b6020026020010181905250612564828461328f565b6080890151519095506060935083925090506000612583826002615a0a565b61258e906001615a0a565b90508067ffffffffffffffff8111156125a9576125a96154a2565b6040519080825280602002602001820160405280156125d2578160200160208202803683370190505b5093508067ffffffffffffffff8111156125ee576125ee6154a2565b60405190808252806020026020018201604052801561263357816020015b604080518082019091526000808252602082015281526020019060019003908161260c5790505b509250505060008060005b8960800151518110156126d75789608001518181518110612661576126616159db565b602002602001015185838151811061267b5761267b6159db565b6020026020010181815250508960a00151818151811061269d5761269d6159db565b60200260200101518483815181106126b7576126b76159db565b60209081029190910101526126cd600183615a0a565b915060010161263e565b5088602001518482815181106126ef576126ef6159db565b6020026020010181815250508860c00151838281518110612712576127126159db565b6020908102919091010152612728600182615a0a565b895160408b01519192509060008982840990508087858151811061274e5761274e6159db565b6020026020010181815250505050508860e00151838281518110612774576127746159db565b602090810291909101015261278a600182615a0a565b60608a0151909150878184089250506127a282613389565b8482815181106127b4576127b46159db565b6020026020010181815250506127ec604080518082018252600080825260209182015281518083019092526001825260029082015290565b8382815181106127fe576127fe6159db565b602002602001018190525061281b612816848661328f565b6133df565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe481525090506128d98382846128d461347e565b61354f565b9695505050505050565b806001600160a01b03163b600003612932576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610942565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516129a89190615a1d565b600060405180830381855af49150503d80600081146129e3576040519150601f19603f3d011682016040523d82523d6000602084013e6129e8565b606091505b50915091506129f8858383613633565b925050505b92915050565b3415610c75576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615612a7557505050565b8251602084015182600384858586098509088382830914838210848410161693505050816115d75760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610942565b612b2d60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805180820190915260608152600060208201527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001612b6e8287876136a8565b81518451612b7b90613a89565b612b888660200151613a89565b612b958760400151613a89565b612ba28860600151613a89565b612baf8960800151613a89565b604051602001612bc496959493929190615a39565b60408051601f198184030181529190528252612bdf82613b4c565b50612be982613b4c565b6060840152612bf782613b4c565b6080840152815160a0850151612c0c90613a89565b604051602001612c1d929190615ab8565b60408051601f198184030181529190528252612c3882613b4c565b8352815160c0850151612c4a90613a89565b612c578660e00151613a89565b612c65876101000151613a89565b612c73886101200151613a89565b612c81896101400151613a89565b604051602001612c9696959493929190615a39565b60408051601f198184030181529190528252612cb182613b4c565b60a084015281516101a0850151612cc790613bc0565b612cd5866101c00151613bc0565b612ce3876101e00151613bc0565b612cf1886102000151613bc0565b612cff896102200151613bc0565b604051602001612d1496959493929190615ae7565b60408051601f19818403018152919052808352610240850151612d3690613bc0565b612d44866102600151613bc0565b612d52876102800151613bc0565b612d60886102a00151613bc0565b612d6e896102c00151613bc0565b604051602001612d8396959493929190615ae7565b60408051601f198184030181529190528252612d9e82613b4c565b60c08401528151610160850151612db490613a89565b612dc2866101800151613a89565b604051602001612dd493929190615b23565b60408051601f198184030181529190528252612def82613b4c565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612e486040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612edc57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b816202000003612f7157506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b81620400000361300657506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b81620800000361309b57506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b81621000000361313057506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b816020036131c357506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b6040517fe2ef09e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61321e60405180606001604052806000815260200160008152602001600081525090565b6132288484613d0c565b8082526132389085908590613d72565b6020820152805161324e90859084908690613df8565b60408201529392505050565b600080613268858789613fbf565b90506132788886898988886140bd565b6132838187866143db565b98975050505050505050565b604080518082019091526000808252602082015282518251146132f45760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d617463686044820152606401610942565b6133328360008151811061330a5761330a6159db565b602002602001015183600081518110613325576133256159db565b602002602001015161443d565b905060015b82518110156133825761337882613373868481518110613359576133596159db565b6020026020010151868581518110613325576133256159db565b6144e1565b9150600101613337565b5092915050565b60006133b57f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183615b7c565b6129fd907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001615b9e565b6040805180820190915260008082526020820152815160208301511590151615613407575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47846020015161344c9190615b7c565b613476907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615b9e565b905292915050565b6134a96040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806136255760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610942565b50151590505b949350505050565b6060826136485761364382614588565b612096565b815115801561365f57506001600160a01b0384163b155b156136a1576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610942565b5080612096565b825160fe906136e36136b983613bc0565b6040516020016136cb91815260200190565b604051602081830303815290604052600060046145ca565b61371d6136f38660000151613bc0565b60405160200161370591815260200190565b604051602081830303815290604052600060086145ca565b61372d6136f38760200151613bc0565b6040516020016137409493929190615bb1565b60408051601f1981840301815291905280855261375d6001613bc0565b6137867f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a613bc0565b6137af7f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025613bc0565b6137d87f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a613bc0565b6138017f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881613bc0565b60405160200161381696959493929190615ae7565b60408051601f1981840301815291905280855260e084015161383790613a89565b613845856101000151613a89565b613853866101200151613a89565b613861876101400151613a89565b61386f886101600151613a89565b61387d896101800151613a89565b61388b8a6101e00151613a89565b6040516020016138a2989796959493929190615c08565b60408051601f198184030181529190528085526102008401516138c490613a89565b6138d2856102200151613a89565b6138e0866102400151613a89565b6138ee876101a00151613a89565b6138fc886101c00151613a89565b61390a896102600151613a89565b6040516020016139209796959493929190615cad565b60408051601f1981840301815291815281865284015161393f90613a89565b61394c8560600151613a89565b6139598660800151613a89565b6139668760a00151613a89565b6139738860c00151613a89565b60405160200161398896959493929190615a39565b60408051601f1981840301815291905280855282516139bf9084906000906139b2576139b26159db565b6020026020010151613bc0565b6139d5846001815181106139b2576139b26159db565b6139eb856002815181106139b2576139b26159db565b613a01866003815181106139b2576139b26159db565b613a17876004815181106139b2576139b26159db565b613a2d886005815181106139b2576139b26159db565b613a43896006815181106139b2576139b26159db565b613a598a6007815181106139b2576139b26159db565b604051602001613a7199989796959493929190615d3f565b60408051601f19818403018152919052909352505050565b805160208201516060916000911590151615613ac2577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b10613b1657507f80000000000000000000000000000000000000000000000000000000000000005b8251613b23908217613bc0565b604051602001613b3591815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613b835760208186018101518383015201613b69565b505060209182019020908601819052925060006128d97f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185615b7c565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b81516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838015613d625784935060005b82811015613d5657838586099450600101613d40565b50600184039350613d69565b6001830393505b50505092915050565b600082600103613d8457506001612096565b81600003613d9457506000612096565b60408401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190600090828186099050858015613dd657600187039250613ddd565b6001840392505b50613de7826146f2565b915082828209979650505050505050565b82516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838303613e8b57600160005b82811015613e7e57818703613e5f57878181518110613e4c57613e4c6159db565b602002602001015194505050505061362b565b8380613e6d57613e6d615b66565b896060015183099150600101613e2b565b506000935050505061362b565b6000806000808a604001519050600080613ea58d886147aa565b905060008767ffffffffffffffff811115613ec257613ec26154a2565b604051908082528060200260200182016040528015613eeb578160200160208202803683370190505b509050888b850993506001925060005b88811015613f3057602081026020840101519550898d878c030896508987850960208281028401018890529350600101613efb565b50613f3a836146f2565b925060005b88811015613fad5760208102602084010151955089868609975089848909975060005b89811015613f8c57808214613f84576020810260208401015197508a888a0998505b600101613f62565b506020810260208f010151955089868909975089888c089a50600101613f3f565b50505050505050505050949350505050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b6140cb86868686858761489b565b60c085015182517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019190819081908690601490811061410c5761410c6159db565b602002602001018181525050856000015184601481518110614130576141306159db565b60200260200101819052508282820990508085601581518110614155576141556159db565b602002602001018181525050856020015184601581518110614179576141796159db565b6020026020010181905250828282099050808560168151811061419e5761419e6159db565b6020026020010181815250508560400151846016815181106141c2576141c26159db565b602002602001018190525082828209905080856017815181106141e7576141e76159db565b60200260200101818152505085606001518460178151811061420b5761420b6159db565b60200260200101819052508282820990508085601881518110614230576142306159db565b602002602001018181525050856080015184601881518110614254576142546159db565b60200260200101819052508282820990508085601981518110614279576142796159db565b60200260200101818152505088604001518460198151811061429d5761429d6159db565b60200260200101819052508282820990508085601a815181106142c2576142c26159db565b602002602001018181525050886060015184601a815181106142e6576142e66159db565b60200260200101819052508282820990508085601b8151811061430b5761430b6159db565b602002602001018181525050886080015184601b8151811061432f5761432f6159db565b60200260200101819052508282820990508085601c81518110614354576143546159db565b6020026020010181815250508860a0015184601c81518110614378576143786159db565b60200260200101819052508282820990508760e0015185601d815181106143a1576143a16159db565b6020026020010181815250508560a0015184601d815181106143c5576143c56159db565b6020026020010181905250505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018381039060005b600a8110156144345760206015820102840151602082026101a0018601518384828409860894505050600101614403565b50509392505050565b6040805180820190915260008082526020820152614459615434565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061448b57600080fd5b50806144d95760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610942565b505092915050565b60408051808201909152600080825260208201526144fd615452565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061453a57600080fd5b50806144d95760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610942565b8051156145985780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060816145d881601f615a0a565b10156146265760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610942565b6146308284615a0a565b845110156146805760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610942565b60608215801561469f57604051915060008252602082016040526146e9565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156146d85780518352602092830192016146c0565b5050858452601f01601f1916604052505b50949350505050565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816147a35760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610942565b5050919050565b606082602001518211156147ea576040517f8c5e11f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018467ffffffffffffffff81111561482b5761482b6154a2565b604051908082528060200260200182016040528015614854578160200160208202803683370190505b50935084151915613d695760208401856020028101600182526020820191505b8082101561489057828585099350838252602082019150614874565b505050505092915050565b6000806000806000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110614a2457614a246159db565b60200260200101819052508587600081518110614a4357614a436159db565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110614b2557614b256159db565b6020908102919091010152614b3a8582615b9e565b87600181518110614b4d57614b4d6159db565b602002602001018181525050886101a0015187600281518110614b7257614b726159db565b602002602001018181525050886101c0015187600381518110614b9757614b976159db565b602002602001018181525050886101e0015187600481518110614bbc57614bbc6159db565b60200260200101818152505088610200015187600581518110614be157614be16159db565b6020026020010181815250508b60e0015188600281518110614c0557614c056159db565b60200260200101819052508b610100015188600381518110614c2957614c296159db565b60200260200101819052508b610120015188600481518110614c4d57614c4d6159db565b60200260200101819052508b610140015188600581518110614c7157614c716159db565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614ca057614ca06159db565b6020026020010181815250508b610160015188600681518110614cc557614cc56159db565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614cf457614cf46159db565b6020026020010181815250508b610180015188600781518110614d1957614d196159db565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614d5257614d526159db565b6020026020010181815250508b6101e0015188600881518110614d7757614d776159db565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614db057614db06159db565b6020026020010181815250508b610200015188600981518110614dd557614dd56159db565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614e0e57614e0e6159db565b6020026020010181815250508b610220015188600a81518110614e3357614e336159db565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614e6c57614e6c6159db565b6020026020010181815250508b610240015188600b81518110614e9157614e916159db565b602002602001018190525088610220015181614ead9190615b9e565b87600c81518110614ec057614ec06159db565b6020026020010181815250508b6101a0015188600c81518110614ee557614ee56159db565b6020026020010181905250600187600d81518110614f0557614f056159db565b6020026020010181815250508b6101c0015188600d81518110614f2a57614f2a6159db565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614f7a57614f7a6159db565b6020026020010181815250508b610260015188600e81518110614f9f57614f9f6159db565b60209081029190910101528951614fb69082615b9e565b87600f81518110614fc957614fc96159db565b6020026020010181815250508860c0015188600f81518110614fed57614fed6159db565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110615033576150336159db565b6020026020010181815250508860e0015188601081518110615057576150576159db565b6020026020010181905250808360206011028901510991508187601181518110615083576150836159db565b602002602001018181525050886101000151886011815181106150a8576150a86159db565b60200260200101819052508083602060120289015109915081876012815181106150d4576150d46159db565b602002602001018181525050886101200151886012815181106150f9576150f96159db565b6020026020010181905250808360206013028901510991508187601381518110615125576151256159db565b6020026020010181815250508861014001518860138151811061514a5761514a6159db565b6020026020010181905250505050505050505050505050565b604051806102800160405280600081526020016000815260200161519a604051806040016040528060008152602001600081525090565b81526020016151bc604051806040016040528060008152602001600081525090565b81526020016151de604051806040016040528060008152602001600081525090565b8152602001615200604051806040016040528060008152602001600081525090565b8152602001615222604051806040016040528060008152602001600081525090565b8152602001615244604051806040016040528060008152602001600081525090565b8152602001615266604051806040016040528060008152602001600081525090565b8152602001615288604051806040016040528060008152602001600081525090565b81526020016152aa604051806040016040528060008152602001600081525090565b81526020016152cc604051806040016040528060008152602001600081525090565b81526020016152ee604051806040016040528060008152602001600081525090565b8152602001615310604051806040016040528060008152602001600081525090565b8152602001615332604051806040016040528060008152602001600081525090565b8152602001615354604051806040016040528060008152602001600081525090565b8152602001615376604051806040016040528060008152602001600081525090565b8152602001615398604051806040016040528060008152602001600081525090565b81526020016153ba604051806040016040528060008152602001600081525090565b81526020016153dc604051806040016040528060008152602001600081525090565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016153ba604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b03811681146131f557600080fd5b60006020828403121561549957600080fd5b61209682615470565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156154dc576154dc6154a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561550b5761550b6154a2565b604052919050565b803567ffffffffffffffff811681146131f557600080fd5b600061010080838503121561553f57600080fd5b6040519081019067ffffffffffffffff82118183101715615562576155626154a2565b8160405280925061557284615513565b815261558060208501615513565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b6000604082840312156155db57600080fd5b6040516040810181811067ffffffffffffffff821117156155fe576155fe6154a2565b604052823581526020928301359281019290925250919050565b60008082840361058081121561562d57600080fd5b615637858561552b565b9250610100610480807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008401121561566e57600080fd5b6156766154b8565b9250615684878388016155c9565b8352610140615695888289016155c9565b60208501526101806156a989828a016155c9565b60408601526101c06156bd8a828b016155c9565b60608701526102006156d18b828c016155c9565b60808801526102406156e58c828d016155c9565b60a08901526102806156f98d828e016155c9565b60c08a01526102c061570d8e828f016155c9565b60e08b01526157208e6103008f016155c9565b898b01526157328e6103408f016155c9565b6101208b01526157468e6103808f016155c9565b878b01526157588e6103c08f016155c9565b6101608b015261576c8e6104008f016155c9565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561580357600080fd5b61580c83615470565b915060208084013567ffffffffffffffff8082111561582a57600080fd5b818601915086601f83011261583e57600080fd5b813581811115615850576158506154a2565b61586284601f19601f840116016154e2565b9150808252878482850101111561587857600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff811681146131f557600080fd5b6000602082840312156158bc57600080fd5b61209682615896565b600080600061014084860312156158db57600080fd5b6158e5858561552b565b92506158f46101008501615896565b91506159036101208501615470565b90509250925092565b6000610100828403121561591f57600080fd5b612096838361552b565b60005b8381101561594457818101518382015260200161592c565b50506000910152565b602081526000825180602084015261596c816040850160208701615929565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160280821691908281146144d9576144d9615980565b67ffffffffffffffff81811683821601908082111561338257613382615980565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615a0357600080fd5b5051919050565b808201808211156129fd576129fd615980565b60008251615a2f818460208701615929565b9190910192915050565b600087516020615a4c8285838d01615929565b885191840191615a5f8184848d01615929565b8851920191615a718184848c01615929565b8751920191615a838184848b01615929565b8651920191615a958184848a01615929565b8551920191615aa78184848901615929565b919091019998505050505050505050565b60008351615aca818460208801615929565b835190830190615ade818360208801615929565b01949350505050565b60008751615af9818460208c01615929565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615b35818460208901615929565b845190830190615b49818360208901615929565b8451910190615b5c818360208801615929565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615b9957634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156129fd576129fd615980565b60008551615bc3818460208a01615929565b855190830190615bd7818360208a01615929565b8551910190615bea818360208901615929565b8451910190615bfd818360208801615929565b019695505050505050565b600089516020615c1b8285838f01615929565b8a5191840191615c2e8184848f01615929565b8a51920191615c408184848e01615929565b8951920191615c528184848d01615929565b8851920191615c648184848c01615929565b8751920191615c768184848b01615929565b8651920191615c888184848a01615929565b8551920191615c9a8184848901615929565b919091019b9a5050505050505050505050565b600088516020615cc08285838e01615929565b895191840191615cd38184848e01615929565b8951920191615ce58184848d01615929565b8851920191615cf78184848c01615929565b8751920191615d098184848b01615929565b8651920191615d1b8184848a01615929565b8551920191615d2d8184848901615929565b919091019a9950505050505050505050565b60008a51615d51818460208f01615929565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fea164736f6c6343000817000a"
+"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615a4562000104600039600081816114320152818161145b01526115c70152615a456000f3fe6080604052600436106101525760003560e01c8063013fa5fc146101575780630d8e6e2c14610179578063313df7b1146101ab578063382b215a146101d8578063409939b7146101fc5780634847ae5d1461021c5780634f1ef2861461029e57806352d1902d146102b157806354646085146102c657806362827733146102db57806369cc6a04146102f15780637053fc5114610306578063715018a61461031b578063766718081461033057806376b6b7cb146103645780637f17baad1461037a57806382d07ff31461042d5780638584d23f146104425780638da5cb5b14610486578063a244d5961461049b578063a51e6fea146104bb578063aa922732146104db578063ad3cb1cc146104fb578063bd32519a14610539578063ca6fe8551461056a578063db13b60a14610580578063e0303301146105bf578063f0682054146105df578063f2fde38b14610611575b600080fd5b34801561016357600080fd5b50610177610172366004614f9d565b610631565b005b34801561018557600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101b757600080fd5b506006546101cb906001600160a01b031681565b6040516101a29190614fb8565b3480156101e457600080fd5b506101ee60035481565b6040519081526020016101a2565b34801561020857600080fd5b5061017761021736600461513d565b6106f1565b34801561022857600080fd5b50610231610a1c565b6040516101a2919060006101008201905060018060401b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101776102ac3660046152f7565b610aae565b3480156102bd57600080fd5b506101ee610acd565b3480156102d257600080fd5b506008546101ee565b3480156102e757600080fd5b506101ee60025481565b3480156102fd57600080fd5b50610177610aea565b34801561031257600080fd5b506007546101ee565b34801561032757600080fd5b50610177610b5a565b34801561033c57600080fd5b5060005461035790600160601b90046001600160401b031681565b6040516101a2919061539c565b34801561037057600080fd5b506101ee60015481565b34801561038657600080fd5b506103e76103953660046153c4565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006909501546001600160401b0380861697600160401b9096041695939492939192919088565b604080516001600160401b03998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101a2565b34801561043957600080fd5b50610231610b6c565b34801561044e57600080fd5b5061046261045d3660046153df565b610bfc565b6040805182516001600160401b0316815260209283015192810192909252016101a2565b34801561049257600080fd5b506101cb610d56565b3480156104a757600080fd5b506101776104b63660046153f8565b610d71565b3480156104c757600080fd5b506101ee6104d63660046153df565b610e9c565b3480156104e757600080fd5b506101ee6104f636600461543f565b610ebd565b34801561050757600080fd5b5061052c604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101a29190615480565b34801561054557600080fd5b5060065461055a90600160a01b900460ff1681565b60405190151581526020016101a2565b34801561057657600080fd5b506101ee60045481565b34801561058c57600080fd5b506105a061059b3660046153df565b610f05565b604080516001600160401b0390931683526020830191909152016101a2565b3480156105cb57600080fd5b5061055a6105da3660046154b3565b610f3d565b3480156105eb57600080fd5b506000546105fc9063ffffffff1681565b60405163ffffffff90911681526020016101a2565b34801561061d57600080fd5b5061017761062c366004614f9d565b611020565b61063961105e565b6001600160a01b0381166106605760405163e6c4247b60e01b815260040160405180910390fd5b6006546001600160a01b039081169082160361068f5760405163a863aec960e01b815260040160405180910390fd5b600680546001600160a81b0319166001600160a01b0380841691909117600160a01b17918290556040517f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072926106e6921690614fb8565b60405180910390a150565b600654600160a01b900460ff16801561071557506006546001600160a01b03163314155b1561075c576006546001600160a01b0316610743576040516312e6d1e760e11b815260040160405180910390fd5b6040516301474c8f60e71b815260040160405180910390fd5b610764610b6c565b5182516001600160401b0391821691161115806107a25750610784610b6c565b602001516001600160401b031682602001516001600160401b031611155b156107c05760405163051c46ef60e01b815260040160405180910390fd5b600080546107e59063ffffffff811690600160601b90046001600160401b03166154eb565b6000805463ffffffff600160401b91829004168252600560205260409091205491925090046001600160401b039081169082161480158161083b5750816001600160401b031684602001516001600160401b0316115b15610864578160405163036466bf60e31b815260040161085b919061539c565b60405180910390fd5b6108718460400151611090565b61087e8460600151611090565b61088b8460800151611090565b6108988460a00151611090565b6108a58460c00151611090565b80156108b3576108b36110ec565b6108bd8484611237565b60008054600160401b9081900463ffffffff168252600560208181526040808520895181548b850180516001600160401b039384166001600160801b0319909316929092179183169097021782558a8301805160018085019190915560608d015160028086019190915560808e0151600386015560a08e0151600486015560c08e01519785019790975560e08d01516006909401939093556007805480850182559089524360008051602061591983398151915290910155835180850185528751831681528151818701908152600880549586018155909952516000805160206159998339815191529390960292830180546001600160401b0319169683169690961790955595516000805160206159d983398151915290910155925188519251935193845284169391909116917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610a24614d9b565b5060008054600160201b900463ffffffff1681526005602081815260409283902083516101008101855281546001600160401b038082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610ab6611427565b610abf826114cc565b610ac98282611503565b5050565b6000610ad76115bc565b5060008051602061595983398151915290565b610af261105e565b600654600160a01b900460ff1615610b3f57600680546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610b6261105e565b610b586000611605565b610b74614d9b565b506000805463ffffffff600160401b918290041682526005602081815260409384902084516101008101865281546001600160401b038082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b60408051808201909152600080825260208201526008805490610c2060018361550e565b81548110610c3057610c30615521565b60009182526020909120600290910201546001600160401b03168310610c6957604051631856a49960e21b815260040160405180910390fd5b60005b81811015610cfe578360088281548110610c8857610c88615521565b60009182526020909120600290910201546001600160401b03161115610cf65760088181548110610cbb57610cbb615521565b60009182526020918290206040805180820190915260029092020180546001600160401b031682526001015491810191909152949350505050565b600101610c6c565b506008610d0c60018361550e565b81548110610d1c57610d1c615521565b60009182526020918290206040805180820190915260029092020180546001600160401b0316825260010154918101919091529392505050565b600080610d61611661565b546001600160a01b031692915050565b6000610d7b611685565b805490915060ff600160401b82041615906001600160401b0316600081158015610da25750825b90506000826001600160401b03166001148015610dbe5750303b155b905081158015610dcc575080155b15610dea5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b03191660011785558315610e1357845460ff60401b1916600160401b1785555b610e1c866116a9565b610e246116ba565b60008054600160201b600160601b031916600160401b179055610e4788886116c2565b8315610e9257845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610e899060019061539c565b60405180910390a15b5050505050505050565b60078181548110610eac57600080fd5b600091825260209091200154905081565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b60088181548110610f1557600080fd5b6000918252602090912060029091020180546001909101546001600160401b03909116915082565b60075460009043841180610f515750600381105b15610f6f5760405163b0b4387760e01b815260040160405180910390fd5b60008080610f7e60018561550e565b90505b81610fe9578660078281548110610f9a57610f9a615521565b906000526020600020015411610fcf576001915060078181548110610fc157610fc1615521565b906000526020600020015492505b60028110610fe95780610fe181615537565b915050610f81565b816110075760405163b0b4387760e01b815260040160405180910390fd5b85611012848961550e565b119450505050505b92915050565b61102861105e565b6001600160a01b038116611052576000604051631e4fbdf760e01b815260040161085b9190614fb8565b61105b81611605565b50565b33611067610d56565b6001600160a01b031614610b58573360405163118cdaa760e01b815260040161085b9190614fb8565b600080516020615979833981519152811080610ac95760405162461bcd60e51b815260206004820152601b60248201527a109b8c8d4d0e881a5b9d985b1a59081cd8d85b185c88199a595b19602a1b604482015260640161085b565b6000805463ffffffff600160401b9182900416825260056020818152604080852081516101008101835281546001600160401b038082168352969004909516928501929092526001820154908401526002810154606084015260038101546080840152600481015460a08401529081015460c08301526006015460e082015261117490610ebd565b600380546001908155908290556004805460025560008054600160401b810463ffffffff16825260056020526040822060060154909255929350909190600c906111cf908490600160601b90046001600160401b031661554e565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f6000600c9054906101000a90046001600160401b03166040516106e6919061539c565b60006112416119e5565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061128057611280615521565b60200260200101818152505083600001516001600160401b0316816001815181106112ad576112ad615521565b60200260200101818152505083602001516001600160401b0316816002815181106112da576112da615521565b6020026020010181815250508360400151816003815181106112fe576112fe615521565b60200260200101818152505083606001518160048151811061132257611322615521565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902060030154825190918391811061136657611366615521565b60209081029190910181019190915260008054600160401b900463ffffffff168152600590915260409020600401548151829060069081106113aa576113aa615521565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902001548151829060079081106113ed576113ed615521565b602002602001018181525050611404828285611fc7565b611421576040516309bde33960e01b815260040160405180910390fd5b50505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806114ae57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114a2600080516020615959833981519152546001600160a01b031690565b6001600160a01b031614155b15610b585760405163703e46dd60e11b815260040160405180910390fd5b6114d461105e565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d816040516106e69190614fb8565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561155d575060408051601f3d908101601f1916820190925261155a9181019061556e565b60015b61157c5781604051634c9c8ce360e01b815260040161085b9190614fb8565b60008051602061595983398151915281146115ad57604051632a87526960e21b81526004810182905260240161085b565b6115b783836120b2565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405163703e46dd60e11b815260040160405180910390fd5b600061160f611661565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6116b1612108565b61105b8161212d565b610b58612108565b81516001600160401b03161515806116e6575060208201516001600160401b031615155b806116f357506080820151155b80611700575060a0820151155b8061170d575060c0820151155b8061171a575060e0820151155b80611729575063ffffffff8116155b15611747576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff160217905550600061192d83610ebd565b600181815560e08501516002818155600393909355600455600780548083018255600091825243600080516020615919833981519152909101556040805180820182526020808901516001600160401b039081168352929098015197810197885260088054948501815590925290516000805160206159998339815191529290930291820180546001600160401b031916939091169290921790915592516000805160206159d9833981519152909301929092555050565b6119ed614df2565b621000008152600860208201527f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b336040820151527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c6020604083015101527f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db6060820151527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e9706020606083015101527f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b996080820151527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d6020608083015101527f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a580662560a0820151527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df60093602060a083015101527f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a960c0820151527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde28602060c083015101527f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b5969360e0820151527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc03602060e083015101527f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e7610100820151527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad602061010083015101527f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e4610120820151527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea17031602061012083015101527f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae7248610140820151527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db7036602061014083015101527f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e5619610160820151527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e8415602061016083015101527f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc8610180820151527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a3602061018083015101527f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc6101a0820151527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c60206101a083015101527f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b406101c0820151527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd560206101c083015101527f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc56101e0820151527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd360206101e083015101527f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa4610200820151527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc602061020083015101527f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a29782226610220820151527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e602061022083015101527f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab2614239610240820151527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd4602061024083015101527f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82610260820151527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d56020610260830151015290565b6000611fd282612135565b611ff583600081518110611fe857611fe8615521565b6020026020010151611090565b61200b83600181518110611fe857611fe8615521565b61202183600281518110611fe857611fe8615521565b61203783600381518110611fe857611fe8615521565b61204d83600481518110611fe857611fe8615521565b61206383600581518110611fe857611fe8615521565b61207983600681518110611fe857611fe8615521565b61208f83600781518110611fe857611fe8615521565b600061209c85858561226d565b90506120a7816123b7565b9150505b9392505050565b6120bb82612816565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612100576115b78282612872565b610ac96128e8565b612110612907565b610b5857604051631afcd79f60e31b815260040160405180910390fd5b611028612108565b805161214090612921565b61214d8160200151612921565b61215a8160400151612921565b6121678160600151612921565b6121748160800151612921565b6121818160a00151612921565b61218e8160c00151612921565b61219b8160e00151612921565b6121a9816101000151612921565b6121b7816101200151612921565b6121c5816101400151612921565b6121d3816101600151612921565b6121e1816101800151612921565b6121ef816101a00151611090565b6121fd816101c00151611090565b61220b816101e00151611090565b612219816102000151611090565b612227816102200151611090565b612235816102400151611090565b612243816102600151611090565b612251816102800151611090565b61225f816102a00151611090565b61105b816102c00151611090565b612275614ef6565b836020015183511461229a576040516320fa9d8960e11b815260040160405180910390fd5b60006122a78585856129af565b905060006122b88660000151612cce565b905060006122cb828460a0015188613099565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b612316614f30565b81526020019060019003908161230e579050509050600061233b8a858a8987876130f9565b60a0870151606087015191925090600080516020615979833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b60006000805160206159798339815191526123d0614f30565b6123d8614f30565b6040805160028082526060820183526000926020830190803683375050604080516002808252606082019092529293506000929150602082015b61241a614f30565b815260200190600190039081612412579050509050600060019050808360008151811061244957612449615521565b6020026020010181815250508760c001518260008151811061246d5761246d615521565b602002602001018190525087600001518360018151811061249057612490615521565b6020026020010181815250508760e00151826001815181106124b4576124b4615521565b60200260200101819052506124c9828461312e565b60808901515190955060609350839250905060006124e8826002615587565b6124f3906001615587565b9050806001600160401b0381111561250d5761250d614fcc565b604051908082528060200260200182016040528015612536578160200160208202803683370190505b509350806001600160401b0381111561255157612551614fcc565b60405190808252806020026020018201604052801561258a57816020015b612577614f30565b81526020019060019003908161256f5790505b509250505060008060005b89608001515181101561262e57896080015181815181106125b8576125b8615521565b60200260200101518583815181106125d2576125d2615521565b6020026020010181815250508960a0015181815181106125f4576125f4615521565b602002602001015184838151811061260e5761260e615521565b6020908102919091010152612624600183615587565b9150600101612595565b50886020015184828151811061264657612646615521565b6020026020010181815250508860c0015183828151811061266957612669615521565b602090810291909101015261267f600182615587565b895160408b0151919250906000898284099050808785815181106126a5576126a5615521565b6020026020010181815250505050508860e001518382815181106126cb576126cb615521565b60209081029190910101526126e1600182615587565b60608a0151909150878184089250506126f98261321c565b84828151811061270b5761270b615521565b60200260200101818152505061271f61324e565b83828151811061273157612731615521565b602002602001018190525061274e612749848661312e565b61326f565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4815250905061280c8382846128076132dc565b6133ad565b9695505050505050565b806001600160a01b03163b6000036128435780604051634c9c8ce360e01b815260040161085b9190614fb8565b60008051602061595983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161288f919061559a565b600060405180830381855af49150503d80600081146128ca576040519150601f19603f3d011682016040523d82523d6000602084013e6128cf565b606091505b50915091506128df858383613490565b95945050505050565b3415610b585760405163b398979f60e01b815260040160405180910390fd5b6000612911611685565b54600160401b900460ff16919050565b60006000805160206158f983398151915261293b836134e3565b1561294557505050565b8251602084015182600384858586098509088382830914838210848410161693505050816115b75760405162461bcd60e51b8152602060048201526017602482015276109b8c8d4d0e881a5b9d985b1a590811cc481c1bda5b9d604a1b604482015260640161085b565b6129f760405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080518082019091526060815260006020820152600080516020615979833981519152612a268287876134f2565b81518451612a339061388b565b612a40866020015161388b565b612a4d876040015161388b565b612a5a886060015161388b565b612a67896080015161388b565b604051602001612a7c969594939291906155b6565b60408051601f198184030181529190528252612a9782613900565b50612aa182613900565b6060840152612aaf82613900565b6080840152815160a0850151612ac49061388b565b604051602001612ad5929190615635565b60408051601f198184030181529190528252612af082613900565b8352815160c0850151612b029061388b565b612b0f8660e0015161388b565b612b1d87610100015161388b565b612b2b88610120015161388b565b612b3989610140015161388b565b604051602001612b4e969594939291906155b6565b60408051601f198184030181529190528252612b6982613900565b60a084015281516101a0850151612b7f90613962565b612b8d866101c00151613962565b612b9b876101e00151613962565b612ba9886102000151613962565b612bb7896102200151613962565b604051602001612bcc96959493929190615664565b60408051601f19818403018152919052808352610240850151612bee90613962565b612bfc866102600151613962565b612c0a876102800151613962565b612c18886102a00151613962565b612c26896102c00151613962565b604051602001612c3b96959493929190615664565b60408051601f198184030181529190528252612c5682613900565b60c08401528151610160850151612c6c9061388b565b612c7a86610180015161388b565b604051602001612c8c939291906156a0565b60408051601f198184030181529190528252612ca782613900565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612d006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612d9457506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b816202000003612e2957506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b816204000003612ebe57506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b816208000003612f5357506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b816210000003612fe857506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b8160200361307b57506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b60405163e2ef09e560e01b815260040160405180910390fd5b919050565b6130bd60405180606001604052806000815260200160008152602001600081525090565b6130c78484613a99565b8082526130d79085908590613aed565b602082015280516130ed90859084908690613b61565b60408201529392505050565b600080613107858789613d15565b9050613117888689898888613e01565b61312281878661410d565b98975050505050505050565b613136614f30565b82518251146131875760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d61746368604482015260640161085b565b6131c58360008151811061319d5761319d615521565b6020026020010151836000815181106131b8576131b8615521565b602002602001015161415d565b905060015b82518110156132155761320b826132068684815181106131ec576131ec615521565b60200260200101518685815181106131b8576131b8615521565b6141f1565b91506001016131ca565b5092915050565b6000613236600080516020615979833981519152836156f9565b61101a9060008051602061597983398151915261550e565b613256614f30565b5060408051808201909152600181526002602082015290565b613277614f30565b613280826134e3565b15613289575090565b6040518060400160405280836000015181526020016000805160206158f983398151915284602001516132bc91906156f9565b6132d4906000805160206158f983398151915261550e565b905292915050565b6133076040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806134825760405162461bcd60e51b815260206004820152601c60248201527b426e3235343a2050616972696e6720636865636b206661696c65642160201b604482015260640161085b565b50151590505b949350505050565b6060826134a5576134a08261428c565b6120ab565b81511580156134bc57506001600160a01b0384163b155b156134dc5783604051639996b31560e01b815260040161085b9190614fb8565b50806120ab565b80516020909101511590151690565b825160fe9061352d61350383613962565b60405160200161351591815260200190565b604051602081830303815290604052600060046142b5565b61356761353d8660000151613962565b60405160200161354f91815260200190565b604051602081830303815290604052600060086142b5565b61357761353d8760200151613962565b60405160200161358a949392919061571b565b60408051601f198184030181529190528085526135a76001613962565b6135be600080516020615a19833981519152613962565b6135d56000805160206159b9833981519152613962565b6135ec6000805160206159f9833981519152613962565b613603600080516020615939833981519152613962565b60405160200161361896959493929190615664565b60408051601f1981840301815291905280855260e08401516136399061388b565b61364785610100015161388b565b61365586610120015161388b565b61366387610140015161388b565b61367188610160015161388b565b61367f89610180015161388b565b61368d8a6101e0015161388b565b6040516020016136a4989796959493929190615772565b60408051601f198184030181529190528085526102008401516136c69061388b565b6136d485610220015161388b565b6136e286610240015161388b565b6136f0876101a0015161388b565b6136fe886101c0015161388b565b61370c89610260015161388b565b6040516020016137229796959493929190615817565b60408051601f198184030181529181528186528401516137419061388b565b61374e856060015161388b565b61375b866080015161388b565b6137688760a0015161388b565b6137758860c0015161388b565b60405160200161378a969594939291906155b6565b60408051601f1981840301815291905280855282516137c19084906000906137b4576137b4615521565b6020026020010151613962565b6137d7846001815181106137b4576137b4615521565b6137ed856002815181106137b4576137b4615521565b613803866003815181106137b4576137b4615521565b613819876004815181106137b4576137b4615521565b61382f886005815181106137b4576137b4615521565b613845896006815181106137b4576137b4615521565b61385b8a6007815181106137b4576137b4615521565b604051602001613873999897969594939291906158a9565b60408051601f19818403018152919052909352505050565b60606000613898836134e3565b156138a457600160fe1b175b60208301516000805160206158f983398151915260019190911b106138ca5750600160ff1b5b82516138d7908217613962565b6040516020016138e991815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613937576020818601810151838301520161391d565b5050602091820190209086018190529250600061280c600080516020615979833981519152856156f9565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1916901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1916901c1790506040816001600160401b03600160801b03600160c01b0316901b6040826001600160401b03600160801b03600160c01b031916901c179050608081901b608082901c179050919050565b815160009060008051602061597983398151915290838015613add5784935060005b82811015613ad157838586099450600101613abb565b50600184039350613ae4565b6001830393505b50505092915050565b600082600103613aff575060016120ab565b81600003613b0f575060006120ab565b604084015160008051602061597983398151915290600090828186099050858015613b3f57600187039250613b46565b6001840392505b50613b50826143c2565b915082828209979650505050505050565b825160009060008051602061597983398151915290838303613be257600160005b82811015613bd557818703613bb657878181518110613ba357613ba3615521565b6020026020010151945050505050613488565b8380613bc457613bc46156e3565b896060015183099150600101613b82565b5060009350505050613488565b6000806000808a604001519050600080613bfc8d88614468565b90506000876001600160401b03811115613c1857613c18614fcc565b604051908082528060200260200182016040528015613c41578160200160208202803683370190505b509050888b850993506001925060005b88811015613c8657602081026020840101519550898d878c030896508987850960208281028401018890529350600101613c51565b50613c90836143c2565b925060005b88811015613d035760208102602084010151955089868609975089848909975060005b89811015613ce257808214613cda576020810260208401015197508a888a0998505b600101613cb8565b506020810260208f010151955089868909975089888c089a50600101613c95565b50505050505050505050949350505050565b6000806000805160206159798339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b613e0f86868686858761452d565b60c0850151825160008051602061597983398151915291908190819086906014908110613e3e57613e3e615521565b602002602001018181525050856000015184601481518110613e6257613e62615521565b60200260200101819052508282820990508085601581518110613e8757613e87615521565b602002602001018181525050856020015184601581518110613eab57613eab615521565b60200260200101819052508282820990508085601681518110613ed057613ed0615521565b602002602001018181525050856040015184601681518110613ef457613ef4615521565b60200260200101819052508282820990508085601781518110613f1957613f19615521565b602002602001018181525050856060015184601781518110613f3d57613f3d615521565b60200260200101819052508282820990508085601881518110613f6257613f62615521565b602002602001018181525050856080015184601881518110613f8657613f86615521565b60200260200101819052508282820990508085601981518110613fab57613fab615521565b602002602001018181525050886040015184601981518110613fcf57613fcf615521565b60200260200101819052508282820990508085601a81518110613ff457613ff4615521565b602002602001018181525050886060015184601a8151811061401857614018615521565b60200260200101819052508282820990508085601b8151811061403d5761403d615521565b602002602001018181525050886080015184601b8151811061406157614061615521565b60200260200101819052508282820990508085601c8151811061408657614086615521565b6020026020010181815250508860a0015184601c815181106140aa576140aa615521565b60200260200101819052508282820990508760e0015185601d815181106140d3576140d3615521565b6020026020010181815250508560a0015184601d815181106140f7576140f7615521565b6020026020010181905250505050505050505050565b6000805160206159798339815191528381039060005b600a8110156141545760206015820102840151602082026101a0018601518384828409860894505050600101614123565b50509392505050565b614165614f30565b61416d614f4a565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061419f57600080fd5b50806141e95760405162461bcd60e51b8152602060048201526019602482015278426e3235343a207363616c6172206d756c206661696c65642160381b604482015260640161085b565b505092915050565b6141f9614f30565b614201614f68565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061423e57600080fd5b50806141e95760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c656421000000604482015260640161085b565b80511561429c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6060816142c381601f615587565b10156143025760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161085b565b61430c8284615587565b845110156143505760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161085b565b60608215801561436f57604051915060008252602082016040526143b9565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156143a8578051835260209283019201614390565b5050858452601f01601f1916604052505b50949350505050565b6000806000600080516020615979833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816144615760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c656421000000604482015260640161085b565b5050919050565b6060826020015182111561448f57604051638c5e11f160e01b815260040160405180910390fd5b60608301516001600080516020615979833981519152846001600160401b038111156144bd576144bd614fcc565b6040519080825280602002602001820160405280156144e6578160200160208202803683370190505b50935084151915613ae45760208401856020028101600182526020820191505b8082101561452257828585099350838252602082019150614506565b505050505092915050565b60008060008060008060008051602061597983398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c01518308915080848309935080600080516020615a1983398151915284099150806101c08a0151830891508060808c015183089150808483099350806000805160206159b983398151915284099150806101e08a0151830891508060808c015183089150808483099350806000805160206159f983398151915284099150806102008a0151830891508060808c0151830891508084830993508060008051602061593983398151915284099150806102208a0151830891508060808c0151830891508084830993508084870895508860a001518860008151811061465c5761465c615521565b6020026020010181905250858760008151811061467b5761467b615521565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c001518860018151811061475d5761475d615521565b6020908102919091010152614772858261550e565b8760018151811061478557614785615521565b602002602001018181525050886101a00151876002815181106147aa576147aa615521565b602002602001018181525050886101c00151876003815181106147cf576147cf615521565b602002602001018181525050886101e00151876004815181106147f4576147f4615521565b6020026020010181815250508861020001518760058151811061481957614819615521565b6020026020010181815250508b60e001518860028151811061483d5761483d615521565b60200260200101819052508b61010001518860038151811061486157614861615521565b60200260200101819052508b61012001518860048151811061488557614885615521565b60200260200101819052508b6101400151886005815181106148a9576148a9615521565b6020026020010181905250806101c08a01516101a08b015109925082876006815181106148d8576148d8615521565b6020026020010181815250508b6101600151886006815181106148fd576148fd615521565b6020026020010181905250806102008a01516101e08b0151099250828760078151811061492c5761492c615521565b6020026020010181815250508b61018001518860078151811061495157614951615521565b60200260200101819052506101a08901519250808384099150808283099150808284099250828760088151811061498a5761498a615521565b6020026020010181815250508b6101e00151886008815181106149af576149af615521565b60200260200101819052506101c0890151925080838409915080828309915080828409925082876009815181106149e8576149e8615521565b6020026020010181815250508b610200015188600981518110614a0d57614a0d615521565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614a4657614a46615521565b6020026020010181815250508b610220015188600a81518110614a6b57614a6b615521565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614aa457614aa4615521565b6020026020010181815250508b610240015188600b81518110614ac957614ac9615521565b602002602001018190525088610220015181614ae5919061550e565b87600c81518110614af857614af8615521565b6020026020010181815250508b6101a0015188600c81518110614b1d57614b1d615521565b6020026020010181905250600187600d81518110614b3d57614b3d615521565b6020026020010181815250508b6101c0015188600d81518110614b6257614b62615521565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614bb257614bb2615521565b6020026020010181815250508b610260015188600e81518110614bd757614bd7615521565b60209081029190910101528951614bee908261550e565b87600f81518110614c0157614c01615521565b6020026020010181815250508860c0015188600f81518110614c2557614c25615521565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110614c6b57614c6b615521565b6020026020010181815250508860e0015188601081518110614c8f57614c8f615521565b6020026020010181905250808360206011028901510991508187601181518110614cbb57614cbb615521565b60200260200101818152505088610100015188601181518110614ce057614ce0615521565b6020026020010181905250808360206012028901510991508187601281518110614d0c57614d0c615521565b60200260200101818152505088610120015188601281518110614d3157614d31615521565b6020026020010181905250808360206013028901510991508187601381518110614d5d57614d5d615521565b60200260200101818152505088610140015188601381518110614d8257614d82615521565b6020026020010181905250505050505050505050505050565b60405180610100016040528060006001600160401b0316815260200160006001600160401b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061028001604052806000815260200160008152602001614e14614f30565b8152602001614e21614f30565b8152602001614e2e614f30565b8152602001614e3b614f30565b8152602001614e48614f30565b8152602001614e55614f30565b8152602001614e62614f30565b8152602001614e6f614f30565b8152602001614e7c614f30565b8152602001614e89614f30565b8152602001614e96614f30565b8152602001614ea3614f30565b8152602001614eb0614f30565b8152602001614ebd614f30565b8152602001614eca614f30565b8152602001614ed7614f30565b8152602001614ee4614f30565b8152602001614ef1614f30565b905290565b604051806101000160405280600081526020016000815260200160008152602001600081526020016060815260200160608152602001614ee45b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b038116811461309457600080fd5b600060208284031215614faf57600080fd5b6120ab82614f86565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561500557615005614fcc565b60405290565b604051601f8201601f191681016001600160401b038111828210171561503357615033614fcc565b604052919050565b80356001600160401b038116811461309457600080fd5b600061010080838503121561506657600080fd5b604051908101906001600160401b038211818310171561508857615088614fcc565b816040528092506150988461503b565b81526150a66020850161503b565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b60006040828403121561510157600080fd5b604080519081016001600160401b038111828210171561512357615123614fcc565b604052823581526020928301359281019290925250919050565b60008082840361058081121561515257600080fd5b61515c8585615052565b92506101006104808060ff198401121561517557600080fd5b61517d614fe2565b925061518b878388016150ef565b835261014061519c888289016150ef565b60208501526101806151b089828a016150ef565b60408601526101c06151c48a828b016150ef565b60608701526102006151d88b828c016150ef565b60808801526102406151ec8c828d016150ef565b60a08901526102806152008d828e016150ef565b60c08a01526102c06152148e828f016150ef565b60e08b01526152278e6103008f016150ef565b898b01526152398e6103408f016150ef565b6101208b015261524d8e6103808f016150ef565b878b015261525f8e6103c08f016150ef565b6101608b01526152738e6104008f016150ef565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561530a57600080fd5b61531383614f86565b91506020838101356001600160401b038082111561533057600080fd5b818601915086601f83011261534457600080fd5b81358181111561535657615356614fcc565b615368601f8201601f1916850161500b565b9150808252878482850101111561537e57600080fd5b80848401858401376000848284010152508093505050509250929050565b6001600160401b0391909116815260200190565b803563ffffffff8116811461309457600080fd5b6000602082840312156153d657600080fd5b6120ab826153b0565b6000602082840312156153f157600080fd5b5035919050565b6000806000610140848603121561540e57600080fd5b6154188585615052565b925061542761010085016153b0565b91506154366101208501614f86565b90509250925092565b6000610100828403121561545257600080fd5b6120ab8383615052565b60005b8381101561547757818101518382015260200161545f565b50506000910152565b602081526000825180602084015261549f81604085016020870161545c565b601f01601f19169190910160400192915050565b600080604083850312156154c657600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160280821691908281146141e9576141e96154d5565b8181038181111561101a5761101a6154d5565b634e487b7160e01b600052603260045260246000fd5b600081615546576155466154d5565b506000190190565b6001600160401b03818116838216019080821115613215576132156154d5565b60006020828403121561558057600080fd5b5051919050565b8082018082111561101a5761101a6154d5565b600082516155ac81846020870161545c565b9190910192915050565b6000875160206155c98285838d0161545c565b8851918401916155dc8184848d0161545c565b88519201916155ee8184848c0161545c565b87519201916156008184848b0161545c565b86519201916156128184848a0161545c565b8551920191615624818484890161545c565b919091019998505050505050505050565b6000835161564781846020880161545c565b83519083019061565b81836020880161545c565b01949350505050565b60008751615676818460208c0161545c565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b600084516156b281846020890161545c565b8451908301906156c681836020890161545c565b84519101906156d981836020880161545c565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b60008261571657634e487b7160e01b600052601260045260246000fd5b500690565b6000855161572d818460208a0161545c565b855190830190615741818360208a0161545c565b855191019061575481836020890161545c565b845191019061576781836020880161545c565b019695505050505050565b6000895160206157858285838f0161545c565b8a51918401916157988184848f0161545c565b8a519201916157aa8184848e0161545c565b89519201916157bc8184848d0161545c565b88519201916157ce8184848c0161545c565b87519201916157e08184848b0161545c565b86519201916157f28184848a0161545c565b8551920191615804818484890161545c565b919091019b9a5050505050505050505050565b60008851602061582a8285838e0161545c565b89519184019161583d8184848e0161545c565b895192019161584f8184848d0161545c565b88519201916158618184848c0161545c565b87519201916158738184848b0161545c565b86519201916158858184848a0161545c565b8551920191615897818484890161545c565b919091019a9950505050505050505050565b60008a516158bb818460208f0161545c565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6882e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee31ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee42042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4aa164736f6c6343000817000a"
diff --git a/contract-bindings/src/erc1967_proxy.rs b/contract-bindings/src/erc1967_proxy.rs
index 08d99abf0..b3e9992b6 100644
--- a/contract-bindings/src/erc1967_proxy.rs
+++ b/contract-bindings/src/erc1967_proxy.rs
@@ -94,12 +94,12 @@ pub mod erc1967_proxy {
pub static ERC1967PROXY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\x80`@R`@Qa\x03\xEE8\x03\x80a\x03\xEE\x839\x81\x01`@\x81\x90Ra\0\"\x91a\x02hV[a\0,\x82\x82a\x003V[PPa\x03RV[a\0<\x82a\0\x92V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\0\x86Wa\0\x81\x82\x82a\x01\x0EV[PPPV[a\0\x8Ea\x01\x85V[PPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\0\xCDW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x01+\x91\x90a\x036V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x01fW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x01kV[``\x91P[P\x90\x92P\x90Pa\x01|\x85\x83\x83a\x01\xA6V[\x95\x94PPPPPV[4\x15a\x01\xA4W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x01\xBBWa\x01\xB6\x82a\x02\x05V[a\x01\xFEV[\x81Q\x15\x80\x15a\x01\xD2WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x01\xFBW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\0\xC4V[P\x80[\x93\x92PPPV[\x80Q\x15a\x02\x15W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15a\x02_W\x81\x81\x01Q\x83\x82\x01R` \x01a\x02GV[PP`\0\x91\x01RV[`\0\x80`@\x83\x85\x03\x12\x15a\x02{W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x02\x92W`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x02\xAFW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x02\xC3W`\0\x80\xFD[\x81Q\x81\x81\x11\x15a\x02\xD5Wa\x02\xD5a\x02.V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xFDWa\x02\xFDa\x02.V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x03\x16W`\0\x80\xFD[a\x03'\x83` \x83\x01` \x88\x01a\x02DV[\x80\x95PPPPPP\x92P\x92\x90PV[`\0\x82Qa\x03H\x81\x84` \x87\x01a\x02DV[\x91\x90\x91\x01\x92\x91PPV[`\x8E\x80a\x03``\09`\0\xF3\xFE`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`^V[V[`\0`Y\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`|W=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\x80`@R`@Qa\x03\xE78\x03\x80a\x03\xE7\x839\x81\x01`@\x81\x90Ra\0\"\x91a\x02ZV[a\0,\x82\x82a\x003V[PPa\x03XV[a\0<\x82a\0\x92V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\0\x86Wa\0\x81\x82\x82a\x01\tV[PPPV[a\0\x8Ea\x01\x80V[PPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\0\xC8W\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\0\xBF\x91\x90a\x03(V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x01&\x91\x90a\x03a\x01fV[``\x91P[P\x90\x92P\x90Pa\x01w\x85\x83\x83a\x01\xA1V[\x95\x94PPPPPV[4\x15a\x01\x9FW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x01\xB6Wa\x01\xB1\x82a\x01\xF7V[a\x01\xF0V[\x81Q\x15\x80\x15a\x01\xCDWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x01\xEDW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\0\xBF\x91\x90a\x03(V[P\x80[\x93\x92PPPV[\x80Q\x15a\x02\x07W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15a\x02QW\x81\x81\x01Q\x83\x82\x01R` \x01a\x029V[PP`\0\x91\x01RV[`\0\x80`@\x83\x85\x03\x12\x15a\x02mW`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x02\x84W`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x02\xA1W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x02\xB5W`\0\x80\xFD[\x81Q\x81\x81\x11\x15a\x02\xC7Wa\x02\xC7a\x02 V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xEFWa\x02\xEFa\x02 V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x03\x08W`\0\x80\xFD[a\x03\x19\x83` \x83\x01` \x88\x01a\x026V[\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0\x82Qa\x03N\x81\x84` \x87\x01a\x026V[\x91\x90\x91\x01\x92\x91PPV[`\x81\x80a\x03f`\09`\0\xF3\xFE`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static ERC1967PROXY_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`^V[V[`\0`Y\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`|W=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static ERC1967PROXY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/fee_contract.rs b/contract-bindings/src/fee_contract.rs
index 48968ef88..bcb9e9476 100644
--- a/contract-bindings/src/fee_contract.rs
+++ b/contract-bindings/src/fee_contract.rs
@@ -475,12 +475,12 @@ pub mod fee_contract {
pub static FEECONTRACT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa\x0E\xBAa\0\xFD`\09`\0\x81\x81a\x06^\x01R\x81\x81a\x06\x87\x01Ra\x08{\x01Ra\x0E\xBA`\0\xF3\xFE`\x80`@R`\x046\x10a\0\xCBW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0tW\x80c\xC4\xD6m\xE8\x11a\0NW\x80c\xC4\xD6m\xE8\x14a\x02\xA9W\x80c\xF2\xFD\xE3\x8B\x14a\x02\xC9W\x80c\xF3@\xFA\x01\x14a\x02\xE9Wa\x01\x02V[\x80c\x8D\xA5\xCB[\x14a\x01\xF6W\x80c\x8E\xD82q\x14a\x02=W\x80c\xAD<\xB1\xCC\x14a\x02SWa\x01\x02V[\x80cR\xD1\x90-\x11a\0\xA5W\x80cR\xD1\x90-\x14a\x01\xB6W\x80cdP\x06\xCA\x14a\x01\xCBW\x80cqP\x18\xA6\x14a\x01\xE1Wa\x01\x02V[\x80c\r\x8En,\x14a\x014W\x80c'\xE25\xE3\x14a\x01fW\x80cO\x1E\xF2\x86\x14a\x01\xA1Wa\x01\x02V[6a\x01\x02W`@Q\x7F\xBC\x8E\xCA\x1B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA9\xADb\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\x01@W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW`\0\x80\xFD[Pa\x01\x93a\x01\x816`\x04a\x0C\xDBV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01]V[a\x01\xB4a\x01\xAF6`\x04a\r%V[a\x02\xFCV[\0[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x01\x93a\x03\x1BV[4\x80\x15a\x01\xD7W`\0\x80\xFD[Pa\x01\x93`\x01T\x81V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\x01\xB4a\x03JV[4\x80\x15a\x02\x02W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01]V[4\x80\x15a\x02IW`\0\x80\xFD[Pa\x01\x93`\0T\x81V[4\x80\x15a\x02_W`\0\x80\xFD[Pa\x02\x9C`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01]\x91\x90a\x0E\x0BV[4\x80\x15a\x02\xB5W`\0\x80\xFD[Pa\x01\xB4a\x02\xC46`\x04a\x0C\xDBV[a\x03^V[4\x80\x15a\x02\xD5W`\0\x80\xFD[Pa\x01\xB4a\x02\xE46`\x04a\x0C\xDBV[a\x04\xD1V[a\x01\xB4a\x02\xF76`\x04a\x0C\xDBV[a\x05-V[a\x03\x04a\x06SV[a\x03\r\x82a\x07#V[a\x03\x17\x82\x82a\x07jV[PPV[`\0a\x03%a\x08pV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x03Ra\x08\xD2V[a\x03\\`\0a\tFV[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03\xA9WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03\xC6WP0;\x15[\x90P\x81\x15\x80\x15a\x03\xD4WP\x80\x15[\x15a\x04\x0BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04VW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x04_\x86a\t\xCFV[a\x04ga\t\xE0V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\xC9W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x04\xD9a\x08\xD2V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05!W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x05*\x81a\tFV[PV[`\x01T4\x10\x15a\x05iW`@Q\x7Fk\xA4\xA1\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x05\xA5W`@Q\x7F\xC5mF\xD3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\xE5W`@Q\x7Fp+=\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x06\r\x90\x84\x90a\x0E>V[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07+a\x08\xD2V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x07\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x07\xC1\x91\x81\x01\x90a\x0ExV[`\x01[a\x08\x05W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x08aW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x05\x18V[a\x08k\x83\x83a\t\xE8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\t\x04\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x03\\W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x05\x18V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\t\xD7a\n>V[a\x05*\x81a\n\xA5V[a\x03\\a\n>V[a\t\xF1\x82a\n\xADV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\n6Wa\x08k\x82\x82a\x0BUV[a\x03\x17a\x0B\xCDV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x03\\W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xD9a\n>V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\n\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x0Br\x91\x90a\x0E\x91V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x0B\xADW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xB2V[``\x91P[P\x91P\x91Pa\x0B\xC2\x85\x83\x83a\x0C\x05V[\x92PPP[\x92\x91PPV[4\x15a\x03\\W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x0C\x1AWa\x0C\x15\x82a\x0C}V[a\x0CvV[\x81Q\x15\x80\x15a\x0C1WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0CsW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x05\x18V[P\x80[\x93\x92PPPV[\x80Q\x15a\x0C\x8DW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0C\xD6W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0C\xEDW`\0\x80\xFD[a\x0Cv\x82a\x0C\xBFV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\r8W`\0\x80\xFD[a\rA\x83a\x0C\xBFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\r^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\rrW`\0\x80\xFD[\x815\x81\x81\x11\x15a\r\x84Wa\r\x84a\x0C\xF6V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\r\xACWa\r\xACa\x0C\xF6V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\r\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0E\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\r\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0E*\x81`@\x85\x01` \x87\x01a\r\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\x0B\xC7W\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x8AW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0E\xA3\x81\x84` \x87\x01a\r\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa\x0B\xE5a\0\xFD`\09`\0\x81\x81a\x05\r\x01R\x81\x81a\x056\x01Ra\x06\xAD\x01Ra\x0B\xE5`\0\xF3\xFE`\x80`@R`\x046\x10a\0\x9BW`\x005`\xE0\x1C\x80c\r\x8En,\x14a\0\xD2W\x80c'\xE25\xE3\x14a\x01\x04W\x80cO\x1E\xF2\x86\x14a\x01?W\x80cR\xD1\x90-\x14a\x01TW\x80cdP\x06\xCA\x14a\x01iW\x80cqP\x18\xA6\x14a\x01\x7FW\x80c\x8D\xA5\xCB[\x14a\x01\x94W\x80c\x8E\xD82q\x14a\x01\xB6W\x80c\xAD<\xB1\xCC\x14a\x01\xCCW\x80c\xC4\xD6m\xE8\x14a\x02\nW\x80c\xF2\xFD\xE3\x8B\x14a\x02*W\x80c\xF3@\xFA\x01\x14a\x02JWa\0\xB9V[6a\0\xB9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xDEW`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W`\0\x80\xFD[Pa\x011a\x01\x1F6`\x04a\n\x05V[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\0\xFBV[a\x01Ra\x01M6`\x04a\n6V[a\x02]V[\0[4\x80\x15a\x01`W`\0\x80\xFD[Pa\x011a\x02|V[4\x80\x15a\x01uW`\0\x80\xFD[Pa\x011`\x01T\x81V[4\x80\x15a\x01\x8BW`\0\x80\xFD[Pa\x01Ra\x02\x99V[4\x80\x15a\x01\xA0W`\0\x80\xFD[Pa\x01\xA9a\x02\xADV[`@Qa\0\xFB\x91\x90a\n\xF7V[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x011`\0T\x81V[4\x80\x15a\x01\xD8W`\0\x80\xFD[Pa\x01\xFD`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xFB\x91\x90a\x0B/V[4\x80\x15a\x02\x16W`\0\x80\xFD[Pa\x01Ra\x02%6`\x04a\n\x05V[a\x02\xC8V[4\x80\x15a\x026W`\0\x80\xFD[Pa\x01Ra\x02E6`\x04a\n\x05V[a\x03\xE0V[a\x01Ra\x02X6`\x04a\n\x05V[a\x04'V[a\x02ea\x05\x02V[a\x02n\x82a\x05\xA7V[a\x02x\x82\x82a\x05\xE9V[PPV[`\0a\x02\x86a\x06\xA2V[P`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x90V[a\x02\xA1a\x06\xEBV[a\x02\xAB`\0a\x07\x1DV[V[`\0\x80a\x02\xB8a\x07yV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x02\xD2a\x07\x9DV[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x02\xF9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x03\x15WP0;\x15[\x90P\x81\x15\x80\x15a\x03#WP\x80\x15[\x15a\x03AW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x03jW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03s\x86a\x07\xC1V[a\x03{a\x07\xD2V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x03\xD8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x03\xE8a\x06\xEBV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x1BW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xFD[a\x04$\x81a\x07\x1DV[PV[`\x01T4\x10\x15a\x04JW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04mW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x94W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xBC\x90\x84\x90a\x0BbV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xAFa\x06\xEBV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x05\xDE\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x06CWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06@\x91\x81\x01\x90a\x0B\x83V[`\x01[a\x06bW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x81\x14a\x06\x93W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04\x12V[a\x06\x9D\x83\x83a\x07\xDAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xABW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x06\xF4a\x02\xADV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x02\xABW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0a\x07'a\x07yV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x07\xC9a\x080V[a\x04$\x81a\x08UV[a\x02\xABa\x080V[a\x07\xE3\x82a\x08]V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x08(Wa\x06\x9D\x82\x82a\x08\xB9V[a\x02xa\t1V[a\x088a\tPV[a\x02\xABW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x03\xE8a\x080V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\x8AW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x08\xD6\x91\x90a\x0B\x9CV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\t\x11W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\t\x16V[``\x91P[P\x91P\x91Pa\t&\x85\x83\x83a\tjV[\x92PPP[\x92\x91PPV[4\x15a\x02\xABW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\tZa\x07\x9DV[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[``\x82a\t\x7FWa\tz\x82a\t\xC0V[a\t\xB9V[\x81Q\x15\x80\x15a\t\x96WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\t\xB6W\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[P\x80[\x93\x92PPPV[\x80Q\x15a\t\xD0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\0W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\n\x17W`\0\x80\xFD[a\t\xB9\x82a\t\xE9V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[a\nR\x83a\t\xE9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\nnW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\x82W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\x94Wa\n\x94a\n V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\n\xBCWa\n\xBCa\n V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\n\xD5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0[\x83\x81\x10\x15a\x0B&W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0B\x0EV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0BN\x81`@\x85\x01` \x87\x01a\x0B\x0BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t+WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\x95W`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xAE\x81\x84` \x87\x01a\x0B\x0BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static FEECONTRACT_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xCBW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0tW\x80c\xC4\xD6m\xE8\x11a\0NW\x80c\xC4\xD6m\xE8\x14a\x02\xA9W\x80c\xF2\xFD\xE3\x8B\x14a\x02\xC9W\x80c\xF3@\xFA\x01\x14a\x02\xE9Wa\x01\x02V[\x80c\x8D\xA5\xCB[\x14a\x01\xF6W\x80c\x8E\xD82q\x14a\x02=W\x80c\xAD<\xB1\xCC\x14a\x02SWa\x01\x02V[\x80cR\xD1\x90-\x11a\0\xA5W\x80cR\xD1\x90-\x14a\x01\xB6W\x80cdP\x06\xCA\x14a\x01\xCBW\x80cqP\x18\xA6\x14a\x01\xE1Wa\x01\x02V[\x80c\r\x8En,\x14a\x014W\x80c'\xE25\xE3\x14a\x01fW\x80cO\x1E\xF2\x86\x14a\x01\xA1Wa\x01\x02V[6a\x01\x02W`@Q\x7F\xBC\x8E\xCA\x1B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA9\xADb\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\x01@W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW`\0\x80\xFD[Pa\x01\x93a\x01\x816`\x04a\x0C\xDBV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01]V[a\x01\xB4a\x01\xAF6`\x04a\r%V[a\x02\xFCV[\0[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x01\x93a\x03\x1BV[4\x80\x15a\x01\xD7W`\0\x80\xFD[Pa\x01\x93`\x01T\x81V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\x01\xB4a\x03JV[4\x80\x15a\x02\x02W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01]V[4\x80\x15a\x02IW`\0\x80\xFD[Pa\x01\x93`\0T\x81V[4\x80\x15a\x02_W`\0\x80\xFD[Pa\x02\x9C`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01]\x91\x90a\x0E\x0BV[4\x80\x15a\x02\xB5W`\0\x80\xFD[Pa\x01\xB4a\x02\xC46`\x04a\x0C\xDBV[a\x03^V[4\x80\x15a\x02\xD5W`\0\x80\xFD[Pa\x01\xB4a\x02\xE46`\x04a\x0C\xDBV[a\x04\xD1V[a\x01\xB4a\x02\xF76`\x04a\x0C\xDBV[a\x05-V[a\x03\x04a\x06SV[a\x03\r\x82a\x07#V[a\x03\x17\x82\x82a\x07jV[PPV[`\0a\x03%a\x08pV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x03Ra\x08\xD2V[a\x03\\`\0a\tFV[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03\xA9WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03\xC6WP0;\x15[\x90P\x81\x15\x80\x15a\x03\xD4WP\x80\x15[\x15a\x04\x0BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04VW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x04_\x86a\t\xCFV[a\x04ga\t\xE0V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\xC9W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x04\xD9a\x08\xD2V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05!W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x05*\x81a\tFV[PV[`\x01T4\x10\x15a\x05iW`@Q\x7Fk\xA4\xA1\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x05\xA5W`@Q\x7F\xC5mF\xD3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\xE5W`@Q\x7Fp+=\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x06\r\x90\x84\x90a\x0E>V[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07+a\x08\xD2V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x07\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x07\xC1\x91\x81\x01\x90a\x0ExV[`\x01[a\x08\x05W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x08aW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x05\x18V[a\x08k\x83\x83a\t\xE8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\t\x04\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x03\\W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x05\x18V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\t\xD7a\n>V[a\x05*\x81a\n\xA5V[a\x03\\a\n>V[a\t\xF1\x82a\n\xADV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\n6Wa\x08k\x82\x82a\x0BUV[a\x03\x17a\x0B\xCDV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x03\\W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xD9a\n>V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\n\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x0Br\x91\x90a\x0E\x91V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x0B\xADW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xB2V[``\x91P[P\x91P\x91Pa\x0B\xC2\x85\x83\x83a\x0C\x05V[\x92PPP[\x92\x91PPV[4\x15a\x03\\W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x0C\x1AWa\x0C\x15\x82a\x0C}V[a\x0CvV[\x81Q\x15\x80\x15a\x0C1WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0CsW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x05\x18V[P\x80[\x93\x92PPPV[\x80Q\x15a\x0C\x8DW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0C\xD6W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0C\xEDW`\0\x80\xFD[a\x0Cv\x82a\x0C\xBFV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\r8W`\0\x80\xFD[a\rA\x83a\x0C\xBFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\r^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\rrW`\0\x80\xFD[\x815\x81\x81\x11\x15a\r\x84Wa\r\x84a\x0C\xF6V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\r\xACWa\r\xACa\x0C\xF6V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\r\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0E\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\r\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0E*\x81`@\x85\x01` \x87\x01a\r\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\x0B\xC7W\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x8AW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0E\xA3\x81\x84` \x87\x01a\r\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\x9BW`\x005`\xE0\x1C\x80c\r\x8En,\x14a\0\xD2W\x80c'\xE25\xE3\x14a\x01\x04W\x80cO\x1E\xF2\x86\x14a\x01?W\x80cR\xD1\x90-\x14a\x01TW\x80cdP\x06\xCA\x14a\x01iW\x80cqP\x18\xA6\x14a\x01\x7FW\x80c\x8D\xA5\xCB[\x14a\x01\x94W\x80c\x8E\xD82q\x14a\x01\xB6W\x80c\xAD<\xB1\xCC\x14a\x01\xCCW\x80c\xC4\xD6m\xE8\x14a\x02\nW\x80c\xF2\xFD\xE3\x8B\x14a\x02*W\x80c\xF3@\xFA\x01\x14a\x02JWa\0\xB9V[6a\0\xB9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xDEW`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W`\0\x80\xFD[Pa\x011a\x01\x1F6`\x04a\n\x05V[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\0\xFBV[a\x01Ra\x01M6`\x04a\n6V[a\x02]V[\0[4\x80\x15a\x01`W`\0\x80\xFD[Pa\x011a\x02|V[4\x80\x15a\x01uW`\0\x80\xFD[Pa\x011`\x01T\x81V[4\x80\x15a\x01\x8BW`\0\x80\xFD[Pa\x01Ra\x02\x99V[4\x80\x15a\x01\xA0W`\0\x80\xFD[Pa\x01\xA9a\x02\xADV[`@Qa\0\xFB\x91\x90a\n\xF7V[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x011`\0T\x81V[4\x80\x15a\x01\xD8W`\0\x80\xFD[Pa\x01\xFD`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xFB\x91\x90a\x0B/V[4\x80\x15a\x02\x16W`\0\x80\xFD[Pa\x01Ra\x02%6`\x04a\n\x05V[a\x02\xC8V[4\x80\x15a\x026W`\0\x80\xFD[Pa\x01Ra\x02E6`\x04a\n\x05V[a\x03\xE0V[a\x01Ra\x02X6`\x04a\n\x05V[a\x04'V[a\x02ea\x05\x02V[a\x02n\x82a\x05\xA7V[a\x02x\x82\x82a\x05\xE9V[PPV[`\0a\x02\x86a\x06\xA2V[P`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x90V[a\x02\xA1a\x06\xEBV[a\x02\xAB`\0a\x07\x1DV[V[`\0\x80a\x02\xB8a\x07yV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x02\xD2a\x07\x9DV[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x02\xF9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x03\x15WP0;\x15[\x90P\x81\x15\x80\x15a\x03#WP\x80\x15[\x15a\x03AW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x03jW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03s\x86a\x07\xC1V[a\x03{a\x07\xD2V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x03\xD8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x03\xE8a\x06\xEBV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x1BW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xFD[a\x04$\x81a\x07\x1DV[PV[`\x01T4\x10\x15a\x04JW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04mW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x94W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xBC\x90\x84\x90a\x0BbV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xAFa\x06\xEBV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x05\xDE\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x06CWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06@\x91\x81\x01\x90a\x0B\x83V[`\x01[a\x06bW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x81\x14a\x06\x93W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04\x12V[a\x06\x9D\x83\x83a\x07\xDAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xABW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x06\xF4a\x02\xADV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x02\xABW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0a\x07'a\x07yV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x07\xC9a\x080V[a\x04$\x81a\x08UV[a\x02\xABa\x080V[a\x07\xE3\x82a\x08]V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x08(Wa\x06\x9D\x82\x82a\x08\xB9V[a\x02xa\t1V[a\x088a\tPV[a\x02\xABW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x03\xE8a\x080V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\x8AW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x08\xD6\x91\x90a\x0B\x9CV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\t\x11W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\t\x16V[``\x91P[P\x91P\x91Pa\t&\x85\x83\x83a\tjV[\x92PPP[\x92\x91PPV[4\x15a\x02\xABW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\tZa\x07\x9DV[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[``\x82a\t\x7FWa\tz\x82a\t\xC0V[a\t\xB9V[\x81Q\x15\x80\x15a\t\x96WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\t\xB6W\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[P\x80[\x93\x92PPPV[\x80Q\x15a\t\xD0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\0W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\n\x17W`\0\x80\xFD[a\t\xB9\x82a\t\xE9V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[a\nR\x83a\t\xE9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\nnW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\x82W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\x94Wa\n\x94a\n V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\n\xBCWa\n\xBCa\n V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\n\xD5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0[\x83\x81\x10\x15a\x0B&W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0B\x0EV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0BN\x81`@\x85\x01` \x87\x01a\x0B\x0BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t+WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\x95W`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xAE\x81\x84` \x87\x01a\x0B\x0BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static FEECONTRACT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/hot_shot.rs b/contract-bindings/src/hot_shot.rs
index e1a101b3a..792d4644d 100644
--- a/contract-bindings/src/hot_shot.rs
+++ b/contract-bindings/src/hot_shot.rs
@@ -283,12 +283,12 @@ pub mod hot_shot {
pub static HOTSHOT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x06\x07\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0rW`\x005`\xE0\x1C\x80cg\xA2\x1Ep\x11a\0PW\x80cg\xA2\x1Ep\x14a\0\xC8W\x80c\xF1\xF4]\x99\x14a\x01\x12W\x80c\xF4O\xF7\x12\x14a\x01%W`\0\x80\xFD[\x80c\n2\x1C\xFF\x14a\0wW\x80c&\x83=\xCC\x14a\0\x8CW\x80cI\xCE\x89\x97\x14a\0\xA8W[`\0\x80\xFD[a\0\x8Aa\0\x856`\x04a\x04\xA9V[a\x01.V[\0[a\0\x95a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x95a\0\xB66`\x04a\x05\x1EV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xDBa\0\xD66`\x04a\x05\x1EV[a\x02\xEDV[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x9FV[a\0\x8Aa\x01 6`\x04a\x057V[a\x03\x81V[a\0\x95`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01rW`@Q\x7F\xE0\x82\x84\x0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02\xADW`\x01T\x84\x84\x83\x81\x81\x10a\x01\x95Wa\x01\x95a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015\x14a\x02\0W\x83\x83\x82\x81\x81\x10a\x01\xB6Wa\x01\xB6a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Q\x7F4\xE4#\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x02\x1E\x84\x84\x83\x81\x81\x10a\x02\x15Wa\x02\x15a\x05\xBDV[\x90PPP`\x01\x90V[a\x02ZW`\x01T`@Q\x7Fx\x18g\x19\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02lWa\x02la\x05\xBDV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\xA0\x91\x90a\x05\xD3V[\x90\x91UPP`\x01\x01a\x01xV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x03\x18`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x03-Wa\x03-a\x05\xBDV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\xE0V[`\0\x80` \x83\x85\x03\x12\x15a\x04\xBCW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xD4W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\xE8W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\xF7W`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x05\x0CW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x050W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x05KW`\0\x80\xFD[`\x80\x81\x12\x15a\x05YW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x05\x8BWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\xF4WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x05\xB8\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\0\xD9W\x80c\xF4O\xF7\x12\x14a\0\xECW[`\0\x80\xFD[a\0za\0u6`\x04a\x03\xFCV[a\0\xF5V[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04pV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04pV[a\x02iV[`@Qa\0\x8F\x92\x91\x90a\x04\xAFV[a\0za\0\xE76`\x04a\x04\xCAV[a\x02\xFDV[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01 W`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02)W`\x01T\x84\x84\x83\x81\x81\x10a\x01CWa\x01Ca\x05OV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\x95W\x83\x83\x82\x81\x81\x10a\x01dWa\x01da\x05OV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01\x17\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xB3\x84\x84\x83\x81\x81\x10a\x01\xAAWa\x01\xAAa\x05OV[\x90PPP`\x01\x90V[a\x01\xD6W`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01\x17\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x01\xE8Wa\x01\xE8a\x05OV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\x1C\x91\x90a\x05eV[\x90\x91UPP`\x01\x01a\x01&V[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\x94`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xA9Wa\x02\xA9a\x05OV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[`\x04\x90\x95\x02\x94\x85\x01U\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x84\x01U\x84\x81\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x93\x01\x92\x90\x92U\x90Q\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90a\x02\\\x90\x85\x90\x85\x90\x85\x90a\x05\x8CV[`\0\x80` \x83\x85\x03\x12\x15a\x04\x0FW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x04&W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04:W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04IW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04^W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\x82W`\0\x80\xFD[P5\x91\x90PV[\x80Q\x82R` \x81\x01Q` \x83\x01R`@\x81\x01Q`@\x83\x01R``\x81\x01Q``\x83\x01RPPV[`\xA0\x81\x01a\x04\xBD\x82\x85a\x04\x89V[\x82`\x80\x83\x01R\x93\x92PPPV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xDEW`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xECW`\0\x80\xFD[P`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x05\x1DWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x86WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV[`\xC0\x81\x01a\x05\x9A\x82\x86a\x04\x89V[`\x80\x82\x01\x93\x90\x93R`\xA0\x01R\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static HOTSHOT_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0rW`\x005`\xE0\x1C\x80cg\xA2\x1Ep\x11a\0PW\x80cg\xA2\x1Ep\x14a\0\xC8W\x80c\xF1\xF4]\x99\x14a\x01\x12W\x80c\xF4O\xF7\x12\x14a\x01%W`\0\x80\xFD[\x80c\n2\x1C\xFF\x14a\0wW\x80c&\x83=\xCC\x14a\0\x8CW\x80cI\xCE\x89\x97\x14a\0\xA8W[`\0\x80\xFD[a\0\x8Aa\0\x856`\x04a\x04\xA9V[a\x01.V[\0[a\0\x95a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x95a\0\xB66`\x04a\x05\x1EV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xDBa\0\xD66`\x04a\x05\x1EV[a\x02\xEDV[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x9FV[a\0\x8Aa\x01 6`\x04a\x057V[a\x03\x81V[a\0\x95`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01rW`@Q\x7F\xE0\x82\x84\x0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02\xADW`\x01T\x84\x84\x83\x81\x81\x10a\x01\x95Wa\x01\x95a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015\x14a\x02\0W\x83\x83\x82\x81\x81\x10a\x01\xB6Wa\x01\xB6a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Q\x7F4\xE4#\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x02\x1E\x84\x84\x83\x81\x81\x10a\x02\x15Wa\x02\x15a\x05\xBDV[\x90PPP`\x01\x90V[a\x02ZW`\x01T`@Q\x7Fx\x18g\x19\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02lWa\x02la\x05\xBDV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\xA0\x91\x90a\x05\xD3V[\x90\x91UPP`\x01\x01a\x01xV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x03\x18`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x03-Wa\x03-a\x05\xBDV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\xE0V[`\0\x80` \x83\x85\x03\x12\x15a\x04\xBCW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xD4W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\xE8W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\xF7W`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x05\x0CW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x050W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x05KW`\0\x80\xFD[`\x80\x81\x12\x15a\x05YW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x05\x8BWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\xF4WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\0\xD9W\x80c\xF4O\xF7\x12\x14a\0\xECW[`\0\x80\xFD[a\0za\0u6`\x04a\x03\xFCV[a\0\xF5V[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04pV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04pV[a\x02iV[`@Qa\0\x8F\x92\x91\x90a\x04\xAFV[a\0za\0\xE76`\x04a\x04\xCAV[a\x02\xFDV[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01 W`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02)W`\x01T\x84\x84\x83\x81\x81\x10a\x01CWa\x01Ca\x05OV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\x95W\x83\x83\x82\x81\x81\x10a\x01dWa\x01da\x05OV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01\x17\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xB3\x84\x84\x83\x81\x81\x10a\x01\xAAWa\x01\xAAa\x05OV[\x90PPP`\x01\x90V[a\x01\xD6W`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01\x17\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x01\xE8Wa\x01\xE8a\x05OV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\x1C\x91\x90a\x05eV[\x90\x91UPP`\x01\x01a\x01&V[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\x94`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xA9Wa\x02\xA9a\x05OV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[`\x04\x90\x95\x02\x94\x85\x01U\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x84\x01U\x84\x81\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x93\x01\x92\x90\x92U\x90Q\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90a\x02\\\x90\x85\x90\x85\x90\x85\x90a\x05\x8CV[`\0\x80` \x83\x85\x03\x12\x15a\x04\x0FW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x04&W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04:W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04IW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04^W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\x82W`\0\x80\xFD[P5\x91\x90PV[\x80Q\x82R` \x81\x01Q` \x83\x01R`@\x81\x01Q`@\x83\x01R``\x81\x01Q``\x83\x01RPPV[`\xA0\x81\x01a\x04\xBD\x82\x85a\x04\x89V[\x82`\x80\x83\x01R\x93\x92PPPV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xDEW`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xECW`\0\x80\xFD[P`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x05\x1DWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x86WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV[`\xC0\x81\x01a\x05\x9A\x82\x86a\x04\x89V[`\x80\x82\x01\x93\x90\x93R`\xA0\x01R\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static HOTSHOT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs
index be5eb220c..6d3c78ba2 100644
--- a/contract-bindings/src/light_client.rs
+++ b/contract-bindings/src/light_client.rs
@@ -195,6 +195,65 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotCommitment"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotCommitment",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment",
+ ),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("getVersion"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -227,6 +286,37 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockHeight"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint64"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockCommRoot"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("BN254.ScalarField"),
+ ),
+ },
+ ],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("initialize"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -270,6 +360,37 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold",),
+ inputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockNumber"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("threshold"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Bool,
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("bool"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("newFinalizedState"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -461,6 +582,28 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("states"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -762,6 +905,13 @@ pub mod light_client {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory",),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidAddress"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -776,6 +926,15 @@ pub mod light_client {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InvalidHotShotBlockForCommitmentCheck"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned(
+ "InvalidHotShotBlockForCommitmentCheck",
+ ),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidInitialization"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -921,12 +1080,12 @@ pub mod light_client {
pub static LIGHTCLIENT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[Pb\0\0 b\0\0&V[b\0\0\xDAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0wW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD7W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa]\x9Bb\0\x01\x04`\09`\0\x81\x81a\x13\xD0\x01R\x81\x81a\x13\xF9\x01Ra\x15\xE7\x01Ra]\x9B`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\x80W`\x005`\xE0\x1C\x80cvg\x18\x08\x11a\0\xD6W\x80c\xAA\x92'2\x11a\0\x7FW\x80c\xCAo\xE8U\x11a\0YW\x80c\xCAo\xE8U\x14a\x05\xC8W\x80c\xF0h T\x14a\x05\xDEW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x10W`\0\x80\xFD[\x80c\xAA\x92'2\x14a\x04\xCDW\x80c\xAD<\xB1\xCC\x14a\x050W\x80c\xBD2Q\x9A\x14a\x05\x86W`\0\x80\xFD[\x80c\x82\xD0\x7F\xF3\x11a\0\xB0W\x80c\x82\xD0\x7F\xF3\x14a\x04[W\x80c\x8D\xA5\xCB[\x14a\x04pW\x80c\xA2D\xD5\x96\x14a\x04\xADW`\0\x80\xFD[\x80cvg\x18\x08\x14a\x03AW\x80cv\xB6\xB7\xCB\x14a\x03\x8BW\x80c\x7F\x17\xBA\xAD\x14a\x03\xA1W`\0\x80\xFD[\x80cHG\xAE]\x11a\x018W\x80cb\x82w3\x11a\x01\x12W\x80cb\x82w3\x14a\x03\x01W\x80ci\xCCj\x04\x14a\x03\x17W\x80cqP\x18\xA6\x14a\x03,W`\0\x80\xFD[\x80cHG\xAE]\x14a\x02UW\x80cO\x1E\xF2\x86\x14a\x02\xD9W\x80cR\xD1\x90-\x14a\x02\xECW`\0\x80\xFD[\x80c1=\xF7\xB1\x11a\x01iW\x80c1=\xF7\xB1\x14a\x01\xD9W\x80c8+!Z\x14a\x02\x11W\x80c@\x999\xB7\x14a\x025W`\0\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\x85W\x80c\r\x8En,\x14a\x01\xA7W[`\0\x80\xFD[4\x80\x15a\x01\x91W`\0\x80\xFD[Pa\x01\xA5a\x01\xA06`\x04aT\x87V[a\x060V[\0[4\x80\x15a\x01\xB3W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xE5W`\0\x80\xFD[P`\x06Ta\x01\xF9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xD0V[4\x80\x15a\x02\x1DW`\0\x80\xFD[Pa\x02'`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xD0V[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x01\xA5a\x02P6`\x04aV\x18V[a\x07HV[4\x80\x15a\x02aW`\0\x80\xFD[Pa\x02ja\n\x8AV[`@Qa\x01\xD0\x91\x90`\0a\x01\0\x82\x01\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xA5a\x02\xE76`\x04aW\xF0V[a\x0BwV[4\x80\x15a\x02\xF8W`\0\x80\xFD[Pa\x02'a\x0B\x96V[4\x80\x15a\x03\rW`\0\x80\xFD[Pa\x02'`\x02T\x81V[4\x80\x15a\x03#W`\0\x80\xFD[Pa\x01\xA5a\x0B\xC5V[4\x80\x15a\x038W`\0\x80\xFD[Pa\x01\xA5a\x0CwV[4\x80\x15a\x03MW`\0\x80\xFD[P`\0Ta\x03r\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xD0V[4\x80\x15a\x03\x97W`\0\x80\xFD[Pa\x02'`\x01T\x81V[4\x80\x15a\x03\xADW`\0\x80\xFD[Pa\x04\x14a\x03\xBC6`\x04aX\xAAV[`\x05` \x81\x90R`\0\x91\x82R`@\x90\x91 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T\x95\x85\x01T`\x06\x90\x95\x01Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x97h\x01\0\0\0\0\0\0\0\0\x90\x96\x04\x16\x95\x93\x94\x92\x93\x91\x92\x91\x90\x88V[`@\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x99\x8A\x16\x81R\x98\x90\x97\x16` \x89\x01R\x95\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01a\x01\xD0V[4\x80\x15a\x04gW`\0\x80\xFD[Pa\x02ja\x0C\x89V[4\x80\x15a\x04|W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x01\xF9V[4\x80\x15a\x04\xB9W`\0\x80\xFD[Pa\x01\xA5a\x04\xC86`\x04aX\xC5V[a\rsV[4\x80\x15a\x04\xD9W`\0\x80\xFD[Pa\x02'a\x04\xE86`\x04aY\x0CV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[4\x80\x15a\x05 v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0B\xCDa\x0FeV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\x0CCW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x0C\x7Fa\x0FeV[a\x0Cu`\0a\x16>V[a\x0C\xE5`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFFh\x01\0\0\0\0\0\0\0\0\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\r\xBEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\r\xDBWP0;\x15[\x90P\x81\x15\x80\x15a\r\xE9WP\x80\x15[\x15a\x0E W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0EkW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x0Et\x86a\x16\xC7V[a\x0E|a\x16\xD8V[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x90Ua\x0E\xB9\x88\x88a\x16\xE0V[\x83\x15a\x0F\x04W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x0F\x16a\x0FeV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0FYW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\tBV[a\x0Fb\x81a\x16>V[PV[3a\x0F\x97\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0CuW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\tBV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0B\x92W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[`\0\x80Th\x01\0\0\0\0\0\0\0\0\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x11C\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aY\xBAV[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x07=V[`\0a\x11\xB5a\x19\xD0V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x11\xF4Wa\x11\xF4aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x12\"Wa\x12\"aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x12PWa\x12PaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x12tWa\x12taY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x12\x98Wa\x12\x98aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x12\xE1Wa\x12\xE1aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x13*Wa\x13*aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x13rWa\x13raY\xDBV[` \x02` \x01\x01\x81\x81RPPa\x13\x89\x82\x82\x85a\x1F\xB2V[a\x13\xBFW`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x14^WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x14R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\x9Da\x0FeV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07=V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x150WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15-\x91\x81\x01\x90aY\xF1V[`\x01[a\x15qW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x15\xCDW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\tBV[a\x15\xD7\x83\x83a \x9DV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x16\xCFa \xF3V[a\x0Fb\x81a!ZV[a\x0Cua \xF3V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x17\x06WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x17\x13WP`\x80\x82\x01Q\x15[\x80a\x17 WP`\xA0\x82\x01Q\x15[\x80a\x17-WP`\xC0\x82\x01Q\x15[\x80a\x17:WP`\xE0\x82\x01Q\x15[\x80a\x17IWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17\x80W`@Q\x7F\xA1\xBA\x07\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19\xB3\x83`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x19\xD8aQcV[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xBD\x82a!bV[a\x1F\xE0\x83`\0\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[` \x02` \x01\x01Qa\x0F\xD9V[a\x1F\xF6\x83`\x01\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a \x0C\x83`\x02\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a \"\x83`\x03\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a 8\x83`\x04\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a N\x83`\x05\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a d\x83`\x06\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a z\x83`\x07\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[`\0a \x87\x85\x85\x85a\"\x9AV[\x90Pa \x92\x81a$\x1BV[\x91PP[\x93\x92PPPV[a \xA6\x82a(\xE3V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a \xEBWa\x15\xD7\x82\x82a)\x8BV[a\x0B\x92a*\x03V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x0CuW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x16a \xF3V[\x80Qa!m\x90a*;V[a!z\x81` \x01Qa*;V[a!\x87\x81`@\x01Qa*;V[a!\x94\x81``\x01Qa*;V[a!\xA1\x81`\x80\x01Qa*;V[a!\xAE\x81`\xA0\x01Qa*;V[a!\xBB\x81`\xC0\x01Qa*;V[a!\xC8\x81`\xE0\x01Qa*;V[a!\xD6\x81a\x01\0\x01Qa*;V[a!\xE4\x81a\x01 \x01Qa*;V[a!\xF2\x81a\x01@\x01Qa*;V[a\"\0\x81a\x01`\x01Qa*;V[a\"\x0E\x81a\x01\x80\x01Qa*;V[a\"\x1C\x81a\x01\xA0\x01Qa\x0F\xD9V[a\"*\x81a\x01\xC0\x01Qa\x0F\xD9V[a\"8\x81a\x01\xE0\x01Qa\x0F\xD9V[a\"F\x81a\x02\0\x01Qa\x0F\xD9V[a\"T\x81a\x02 \x01Qa\x0F\xD9V[a\"b\x81a\x02@\x01Qa\x0F\xD9V[a\"p\x81a\x02`\x01Qa\x0F\xD9V[a\"~\x81a\x02\x80\x01Qa\x0F\xD9V[a\"\x8C\x81a\x02\xA0\x01Qa\x0F\xD9V[a\x0Fb\x81a\x02\xC0\x01Qa\x0F\xD9V[a\"\xA2aS\xE1V[\x83` \x01Q\x83Q\x14a\"\xE0W`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xED\x85\x85\x85a*\xE5V[\x90P`\0a\"\xFE\x86`\0\x01Qa.\x16V[\x90P`\0a#\x11\x82\x84`\xA0\x01Q\x88a1\xFAV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a#TW\x90PP\x90P`\0a#\x8D\x8A\x85\x8A\x89\x87\x87a2ZV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\xA1W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$\xE4Wa$\xE4aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a%\x08Wa%\x08aY\xDBV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a%+Wa%+aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a%OWa%OaY\xDBV[` \x02` \x01\x01\x81\x90RPa%d\x82\x84a2\x8FV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a%\x83\x82`\x02aZ\nV[a%\x8E\x90`\x01aZ\nV[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xA9Wa%\xA9aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\xD2W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xEEWa%\xEEaT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&3W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x0CW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&\xD7W\x89`\x80\x01Q\x81\x81Q\x81\x10a&aWa&aaY\xDBV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a&{Wa&{aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a&\x9DWa&\x9DaY\xDBV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\xB7Wa&\xB7aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xCD`\x01\x83aZ\nV[\x91P`\x01\x01a&>V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&\xEFWa&\xEFaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a'\x12Wa'\x12aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'(`\x01\x82aZ\nV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a'NWa'NaY\xDBV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a'tWa'taY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\x8A`\x01\x82aZ\nV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa'\xA2\x82a3\x89V[\x84\x82\x81Q\x81\x10a'\xB4Wa'\xB4aY\xDBV[` \x02` \x01\x01\x81\x81RPPa'\xEC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a'\xFEWa'\xFEaY\xDBV[` \x02` \x01\x01\x81\x90RPa(\x1Ba(\x16\x84\x86a2\x8FV[a3\xDFV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\xD9\x83\x82\x84a(\xD4a4~V[a5OV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a)2W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa)\xA8\x91\x90aZ\x1DV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a)\xE3W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a)\xE8V[``\x91P[P\x91P\x91Pa)\xF8\x85\x83\x83a63V[\x92PPP[\x92\x91PPV[4\x15a\x0CuW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a*uWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[a+-`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a+n\x82\x87\x87a6\xA8V[\x81Q\x84Qa+{\x90a:\x89V[a+\x88\x86` \x01Qa:\x89V[a+\x95\x87`@\x01Qa:\x89V[a+\xA2\x88``\x01Qa:\x89V[a+\xAF\x89`\x80\x01Qa:\x89V[`@Q` \x01a+\xC4\x96\x95\x94\x93\x92\x91\x90aZ9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+\xDF\x82a;LV[Pa+\xE9\x82a;LV[``\x84\x01Ra+\xF7\x82a;LV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\x0C\x90a:\x89V[`@Q` \x01a,\x1D\x92\x91\x90aZ\xB8V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,8\x82a;LV[\x83R\x81Q`\xC0\x85\x01Qa,J\x90a:\x89V[a,W\x86`\xE0\x01Qa:\x89V[a,e\x87a\x01\0\x01Qa:\x89V[a,s\x88a\x01 \x01Qa:\x89V[a,\x81\x89a\x01@\x01Qa:\x89V[`@Q` \x01a,\x96\x96\x95\x94\x93\x92\x91\x90aZ9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xB1\x82a;LV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa,\xC7\x90a;\xC0V[a,\xD5\x86a\x01\xC0\x01Qa;\xC0V[a,\xE3\x87a\x01\xE0\x01Qa;\xC0V[a,\xF1\x88a\x02\0\x01Qa;\xC0V[a,\xFF\x89a\x02 \x01Qa;\xC0V[`@Q` \x01a-\x14\x96\x95\x94\x93\x92\x91\x90aZ\xE7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-6\x90a;\xC0V[a-D\x86a\x02`\x01Qa;\xC0V[a-R\x87a\x02\x80\x01Qa;\xC0V[a-`\x88a\x02\xA0\x01Qa;\xC0V[a-n\x89a\x02\xC0\x01Qa;\xC0V[`@Q` \x01a-\x83\x96\x95\x94\x93\x92\x91\x90aZ\xE7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\x9E\x82a;LV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa-\xB4\x90a:\x89V[a-\xC2\x86a\x01\x80\x01Qa:\x89V[`@Q` \x01a-\xD4\x93\x92\x91\x90a[#V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xEF\x82a;LV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.H`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a.\xDCWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a/qWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a0\x9BWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a10WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a1\xC3WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\x1E`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2(\x84\x84a=\x0CV[\x80\x82Ra28\x90\x85\x90\x85\x90a=rV[` \x82\x01R\x80Qa2N\x90\x85\x90\x84\x90\x86\x90a=\xF8V[`@\x82\x01R\x93\x92PPPV[`\0\x80a2h\x85\x87\x89a?\xBFV[\x90Pa2x\x88\x86\x89\x89\x88\x88a@\xBDV[a2\x83\x81\x87\x86aC\xDBV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a2\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\tBV[a32\x83`\0\x81Q\x81\x10a3\nWa3\naY\xDBV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3%Wa3%aY\xDBV[` \x02` \x01\x01QaD=V[\x90P`\x01[\x82Q\x81\x10\x15a3\x82Wa3x\x82a3s\x86\x84\x81Q\x81\x10a3YWa3YaY\xDBV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3%Wa3%aY\xDBV[aD\xE1V[\x91P`\x01\x01a37V[P\x92\x91PPV[`\0a3\xB5\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a[|V[a)\xFD\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a[\x9EV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a4\x07WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa4L\x91\x90a[|V[a4v\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa[\x9EV[\x90R\x92\x91PPV[a4\xA9`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a6%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\tBV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a6HWa6C\x82aE\x88V[a \x96V[\x81Q\x15\x80\x15a6_WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a6\xA1W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\tBV[P\x80a \x96V[\x82Q`\xFE\x90a6\xE3a6\xB9\x83a;\xC0V[`@Q` \x01a6\xCB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aE\xCAV[a7\x1Da6\xF3\x86`\0\x01Qa;\xC0V[`@Q` \x01a7\x05\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aE\xCAV[a7-a6\xF3\x87` \x01Qa;\xC0V[`@Q` \x01a7@\x94\x93\x92\x91\x90a[\xB1V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra7]`\x01a;\xC0V[a7\x86\x7F/\x8D\xD1\xF1\xA7X\x8BW`\x01`\0[\x82\x81\x10\x15a>~W\x81\x87\x03a>_W\x87\x81\x81Q\x81\x10a>LWa>LaY\xDBV[` \x02` \x01\x01Q\x94PPPPPa6+V[\x83\x80a>mWa>ma[fV[\x89``\x01Q\x83\t\x91P`\x01\x01a>+V[P`\0\x93PPPPa6+V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\xA5\x8D\x88aG\xAAV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a>\xC2Wa>\xC2aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xEBW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?0W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xFBV[Pa?:\x83aF\xF2V[\x92P`\0[\x88\x81\x10\x15a?\xADW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?\x8CW\x80\x82\x14a?\x84W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?bV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a??V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\xCB\x86\x86\x86\x86\x85\x87aH\x9BV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aA\x0CWaA\x0CaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aA0WaA0aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aAUWaAUaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aAyWaAyaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA\x9EWaA\x9EaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\xC2WaA\xC2aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xE7WaA\xE7aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aB\x0BWaB\x0BaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aB0WaB0aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aBTWaBTaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aByWaByaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB\x9DWaB\x9DaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\xC2WaB\xC2aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xE6WaB\xE6aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aC\x0BWaC\x0BaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aC/WaC/aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aCTWaCTaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aCxWaCxaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aC\xA1WaC\xA1aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\xC5WaC\xC5aY\xDBV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aD4W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\x03V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaDYaT4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\x8BW`\0\x80\xFD[P\x80aD\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaD\xFDaTRV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aE:W`\0\x80\xFD[P\x80aD\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\tBV[\x80Q\x15aE\x98W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aE\xD8\x81`\x1FaZ\nV[\x10\x15aF&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[aF0\x82\x84aZ\nV[\x84Q\x10\x15aF\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[``\x82\x15\x80\x15aF\x9FW`@Q\x91P`\0\x82R` \x82\x01`@RaF\xE9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01aF\xC0V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aG\xA3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\xEAW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH+WaH+aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aHTW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=iW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aH\x90W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaHtV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7XW`\0\x80\xFD[\x815\x81\x81\x11\x15aXPWaXPaT\xA2V[aXb\x84`\x1F\x19`\x1F\x84\x01\x16\x01aT\xE2V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aXxW`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xBCW`\0\x80\xFD[a \x96\x82aX\x96V[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aX\xDBW`\0\x80\xFD[aX\xE5\x85\x85aU+V[\x92PaX\xF4a\x01\0\x85\x01aX\x96V[\x91PaY\x03a\x01 \x85\x01aTpV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aY\x1FW`\0\x80\xFD[a \x96\x83\x83aU+V[`\0[\x83\x81\x10\x15aYDW\x81\x81\x01Q\x83\x82\x01R` \x01aY,V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaYl\x81`@\x85\x01` \x87\x01aY)V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aD\xD9WaD\xD9aY\x80V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a3\x82Wa3\x82aY\x80V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15aZ\x03W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a)\xFDWa)\xFDaY\x80V[`\0\x82QaZ/\x81\x84` \x87\x01aY)V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZL\x82\x85\x83\x8D\x01aY)V[\x88Q\x91\x84\x01\x91aZ_\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91aZq\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91aZ\x83\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91aZ\x95\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91aZ\xA7\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaZ\xCA\x81\x84` \x88\x01aY)V[\x83Q\x90\x83\x01\x90aZ\xDE\x81\x83` \x88\x01aY)V[\x01\x94\x93PPPPV[`\0\x87QaZ\xF9\x81\x84` \x8C\x01aY)V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[5\x81\x84` \x89\x01aY)V[\x84Q\x90\x83\x01\x90a[I\x81\x83` \x89\x01aY)V[\x84Q\x91\x01\x90a[\\\x81\x83` \x88\x01aY)V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\x99WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a)\xFDWa)\xFDaY\x80V[`\0\x85Qa[\xC3\x81\x84` \x8A\x01aY)V[\x85Q\x90\x83\x01\x90a[\xD7\x81\x83` \x8A\x01aY)V[\x85Q\x91\x01\x90a[\xEA\x81\x83` \x89\x01aY)V[\x84Q\x91\x01\x90a[\xFD\x81\x83` \x88\x01aY)V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\\x1B\x82\x85\x83\x8F\x01aY)V[\x8AQ\x91\x84\x01\x91a\\.\x81\x84\x84\x8F\x01aY)V[\x8AQ\x92\x01\x91a\\@\x81\x84\x84\x8E\x01aY)V[\x89Q\x92\x01\x91a\\R\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91a\\d\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91a\\v\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91a\\\x88\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91a\\\x9A\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a\\\xC0\x82\x85\x83\x8E\x01aY)V[\x89Q\x91\x84\x01\x91a\\\xD3\x81\x84\x84\x8E\x01aY)V[\x89Q\x92\x01\x91a\\\xE5\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91a\\\xF7\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91a]\t\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91a]\x1B\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91a]-\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]Q\x81\x84` \x8F\x01aY)V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[Pb\0\0 b\0\0&V[b\0\0\xDAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0wW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD7W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80QaZEb\0\x01\x04`\09`\0\x81\x81a\x142\x01R\x81\x81a\x14[\x01Ra\x15\xC7\x01RaZE`\0\xF3\xFE`\x80`@R`\x046\x10a\x01RW`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01WW\x80c\r\x8En,\x14a\x01yW\x80c1=\xF7\xB1\x14a\x01\xABW\x80c8+!Z\x14a\x01\xD8W\x80c@\x999\xB7\x14a\x01\xFCW\x80cHG\xAE]\x14a\x02\x1CW\x80cO\x1E\xF2\x86\x14a\x02\x9EW\x80cR\xD1\x90-\x14a\x02\xB1W\x80cTd`\x85\x14a\x02\xC6W\x80cb\x82w3\x14a\x02\xDBW\x80ci\xCCj\x04\x14a\x02\xF1W\x80cpS\xFCQ\x14a\x03\x06W\x80cqP\x18\xA6\x14a\x03\x1BW\x80cvg\x18\x08\x14a\x030W\x80cv\xB6\xB7\xCB\x14a\x03dW\x80c\x7F\x17\xBA\xAD\x14a\x03zW\x80c\x82\xD0\x7F\xF3\x14a\x04-W\x80c\x85\x84\xD2?\x14a\x04BW\x80c\x8D\xA5\xCB[\x14a\x04\x86W\x80c\xA2D\xD5\x96\x14a\x04\x9BW\x80c\xA5\x1Eo\xEA\x14a\x04\xBBW\x80c\xAA\x92'2\x14a\x04\xDBW\x80c\xAD<\xB1\xCC\x14a\x04\xFBW\x80c\xBD2Q\x9A\x14a\x059W\x80c\xCAo\xE8U\x14a\x05jW\x80c\xDB\x13\xB6\n\x14a\x05\x80W\x80c\xE003\x01\x14a\x05\xBFW\x80c\xF0h T\x14a\x05\xDFW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x11W[`\0\x80\xFD[4\x80\x15a\x01cW`\0\x80\xFD[Pa\x01wa\x01r6`\x04aO\x9DV[a\x061V[\0[4\x80\x15a\x01\x85W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB7W`\0\x80\xFD[P`\x06Ta\x01\xCB\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xA2\x91\x90aO\xB8V[4\x80\x15a\x01\xE4W`\0\x80\xFD[Pa\x01\xEE`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xA2V[4\x80\x15a\x02\x08W`\0\x80\xFD[Pa\x01wa\x02\x176`\x04aQ=V[a\x06\xF1V[4\x80\x15a\x02(W`\0\x80\xFD[Pa\x021a\n\x1CV[`@Qa\x01\xA2\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01wa\x02\xAC6`\x04aR\xF7V[a\n\xAEV[4\x80\x15a\x02\xBDW`\0\x80\xFD[Pa\x01\xEEa\n\xCDV[4\x80\x15a\x02\xD2W`\0\x80\xFD[P`\x08Ta\x01\xEEV[4\x80\x15a\x02\xE7W`\0\x80\xFD[Pa\x01\xEE`\x02T\x81V[4\x80\x15a\x02\xFDW`\0\x80\xFD[Pa\x01wa\n\xEAV[4\x80\x15a\x03\x12W`\0\x80\xFD[P`\x07Ta\x01\xEEV[4\x80\x15a\x03'W`\0\x80\xFD[Pa\x01wa\x0BZV[4\x80\x15a\x03F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xD4a\x10^V[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x06\xE6\x91\x90aO\xB8V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x15]WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15Z\x91\x81\x01\x90aUnV[`\x01[a\x15|W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[`\0\x80Q` aYY\x839\x81Q\x91R\x81\x14a\x15\xADW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x08[V[a\x15\xB7\x83\x83a \xB2V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0BXW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x16\x0Fa\x16aV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x16\xB1a!\x08V[a\x10[\x81a!-V[a\x0BXa!\x08V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xE6WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xF3WP`\x80\x82\x01Q\x15[\x80a\x17\0WP`\xA0\x82\x01Q\x15[\x80a\x17\rWP`\xC0\x82\x01Q\x15[\x80a\x17\x1AWP`\xE0\x82\x01Q\x15[\x80a\x17)WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17GW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19-\x83a\x0E\xBDV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` aY\x19\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` aY\x99\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` aY\xD9\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x19\xEDaM\xF2V[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xD2\x82a!5V[a\x1F\xF5\x83`\0\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[` \x02` \x01\x01Qa\x10\x90V[a \x0B\x83`\x01\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a !\x83`\x02\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a 7\x83`\x03\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a M\x83`\x04\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a c\x83`\x05\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a y\x83`\x06\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a \x8F\x83`\x07\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[`\0a \x9C\x85\x85\x85a\"mV[\x90Pa \xA7\x81a#\xB7V[\x91PP[\x93\x92PPPV[a \xBB\x82a(\x16V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\0Wa\x15\xB7\x82\x82a(rV[a\n\xC9a(\xE8V[a!\x10a)\x07V[a\x0BXW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10(a!\x08V[\x80Qa!@\x90a)!V[a!M\x81` \x01Qa)!V[a!Z\x81`@\x01Qa)!V[a!g\x81``\x01Qa)!V[a!t\x81`\x80\x01Qa)!V[a!\x81\x81`\xA0\x01Qa)!V[a!\x8E\x81`\xC0\x01Qa)!V[a!\x9B\x81`\xE0\x01Qa)!V[a!\xA9\x81a\x01\0\x01Qa)!V[a!\xB7\x81a\x01 \x01Qa)!V[a!\xC5\x81a\x01@\x01Qa)!V[a!\xD3\x81a\x01`\x01Qa)!V[a!\xE1\x81a\x01\x80\x01Qa)!V[a!\xEF\x81a\x01\xA0\x01Qa\x10\x90V[a!\xFD\x81a\x01\xC0\x01Qa\x10\x90V[a\"\x0B\x81a\x01\xE0\x01Qa\x10\x90V[a\"\x19\x81a\x02\0\x01Qa\x10\x90V[a\"'\x81a\x02 \x01Qa\x10\x90V[a\"5\x81a\x02@\x01Qa\x10\x90V[a\"C\x81a\x02`\x01Qa\x10\x90V[a\"Q\x81a\x02\x80\x01Qa\x10\x90V[a\"_\x81a\x02\xA0\x01Qa\x10\x90V[a\x10[\x81a\x02\xC0\x01Qa\x10\x90V[a\"uaN\xF6V[\x83` \x01Q\x83Q\x14a\"\x9AW`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xA7\x85\x85\x85a)\xAFV[\x90P`\0a\"\xB8\x86`\0\x01Qa,\xCEV[\x90P`\0a\"\xCB\x82\x84`\xA0\x01Q\x88a0\x99V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a#\x16aO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a#\x0EW\x90PP\x90P`\0a#;\x8A\x85\x8A\x89\x87\x87a0\xF9V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aYy\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` aYy\x839\x81Q\x91Ra#\xD0aO0V[a#\xD8aO0V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a$\x1AaO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\x12W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$IWa$IaU!V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a$mWa$maU!V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a$\x90Wa$\x90aU!V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a$\xB4Wa$\xB4aU!V[` \x02` \x01\x01\x81\x90RPa$\xC9\x82\x84a1.V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a$\xE8\x82`\x02aU\x87V[a$\xF3\x90`\x01aU\x87V[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%\rWa%\raO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%QWa%QaO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\x8AW\x81` \x01[a%waO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%oW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&.W\x89`\x80\x01Q\x81\x81Q\x81\x10a%\xB8Wa%\xB8aU!V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a%\xD2Wa%\xD2aU!V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a%\xF4Wa%\xF4aU!V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\x0EWa&\x0EaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&$`\x01\x83aU\x87V[\x91P`\x01\x01a%\x95V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&FWa&FaU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a&iWa&iaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\x7F`\x01\x82aU\x87V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a&\xA5Wa&\xA5aU!V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a&\xCBWa&\xCBaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xE1`\x01\x82aU\x87V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa&\xF9\x82a2\x1CV[\x84\x82\x81Q\x81\x10a'\x0BWa'\x0BaU!V[` \x02` \x01\x01\x81\x81RPPa'\x1Fa2NV[\x83\x82\x81Q\x81\x10a'1Wa'1aU!V[` \x02` \x01\x01\x81\x90RPa'Na'I\x84\x86a1.V[a2oV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\x0C\x83\x82\x84a(\x07a2\xDCV[a3\xADV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a(CW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[`\0\x80Q` aYY\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa(\x8F\x91\x90aU\x9AV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a(\xCAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a(\xCFV[``\x91P[P\x91P\x91Pa(\xDF\x85\x83\x83a4\x90V[\x95\x94PPPPPV[4\x15a\x0BXW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a)\x11a\x16\x85V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` aX\xF9\x839\x81Q\x91Ra);\x83a4\xE3V[\x15a)EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xB7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\x08[V[a)\xF7`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` aYy\x839\x81Q\x91Ra*&\x82\x87\x87a4\xF2V[\x81Q\x84Qa*3\x90a8\x8BV[a*@\x86` \x01Qa8\x8BV[a*M\x87`@\x01Qa8\x8BV[a*Z\x88``\x01Qa8\x8BV[a*g\x89`\x80\x01Qa8\x8BV[`@Q` \x01a*|\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\x97\x82a9\0V[Pa*\xA1\x82a9\0V[``\x84\x01Ra*\xAF\x82a9\0V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa*\xC4\x90a8\x8BV[`@Q` \x01a*\xD5\x92\x91\x90aV5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\xF0\x82a9\0V[\x83R\x81Q`\xC0\x85\x01Qa+\x02\x90a8\x8BV[a+\x0F\x86`\xE0\x01Qa8\x8BV[a+\x1D\x87a\x01\0\x01Qa8\x8BV[a++\x88a\x01 \x01Qa8\x8BV[a+9\x89a\x01@\x01Qa8\x8BV[`@Q` \x01a+N\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+i\x82a9\0V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa+\x7F\x90a9bV[a+\x8D\x86a\x01\xC0\x01Qa9bV[a+\x9B\x87a\x01\xE0\x01Qa9bV[a+\xA9\x88a\x02\0\x01Qa9bV[a+\xB7\x89a\x02 \x01Qa9bV[`@Q` \x01a+\xCC\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa+\xEE\x90a9bV[a+\xFC\x86a\x02`\x01Qa9bV[a,\n\x87a\x02\x80\x01Qa9bV[a,\x18\x88a\x02\xA0\x01Qa9bV[a,&\x89a\x02\xC0\x01Qa9bV[`@Q` \x01a,;\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,V\x82a9\0V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa,l\x90a8\x8BV[a,z\x86a\x01\x80\x01Qa8\x8BV[`@Q` \x01a,\x8C\x93\x92\x91\x90aV\xA0V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xA7\x82a9\0V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a-\0`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a-\x94WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a.)WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a.\xBEWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a/SWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a/\xE8WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a0{WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a0\xBD`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a0\xC7\x84\x84a:\x99V[\x80\x82Ra0\xD7\x90\x85\x90\x85\x90a:\xEDV[` \x82\x01R\x80Qa0\xED\x90\x85\x90\x84\x90\x86\x90a;aV[`@\x82\x01R\x93\x92PPPV[`\0\x80a1\x07\x85\x87\x89a=\x15V[\x90Pa1\x17\x88\x86\x89\x89\x88\x88a>\x01V[a1\"\x81\x87\x86aA\rV[\x98\x97PPPPPPPPV[a16aO0V[\x82Q\x82Q\x14a1\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\x08[V[a1\xC5\x83`\0\x81Q\x81\x10a1\x9DWa1\x9DaU!V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a1\xB8Wa1\xB8aU!V[` \x02` \x01\x01QaA]V[\x90P`\x01[\x82Q\x81\x10\x15a2\x15Wa2\x0B\x82a2\x06\x86\x84\x81Q\x81\x10a1\xECWa1\xECaU!V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a1\xB8Wa1\xB8aU!V[aA\xF1V[\x91P`\x01\x01a1\xCAV[P\x92\x91PPV[`\0a26`\0\x80Q` aYy\x839\x81Q\x91R\x83aV\xF9V[a\x10\x1A\x90`\0\x80Q` aYy\x839\x81Q\x91RaU\x0EV[a2VaO0V[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a2waO0V[a2\x80\x82a4\xE3V[\x15a2\x89WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aX\xF9\x839\x81Q\x91R\x84` \x01Qa2\xBC\x91\x90aV\xF9V[a2\xD4\x90`\0\x80Q` aX\xF9\x839\x81Q\x91RaU\x0EV[\x90R\x92\x91PPV[a3\x07`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a4\x82W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\x08[V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a4\xA5Wa4\xA0\x82aB\x8CV[a \xABV[\x81Q\x15\x80\x15a4\xBCWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a4\xDCW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[P\x80a \xABV[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a5-a5\x03\x83a9bV[`@Q` \x01a5\x15\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aB\xB5V[a5ga5=\x86`\0\x01Qa9bV[`@Q` \x01a5O\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aB\xB5V[a5wa5=\x87` \x01Qa9bV[`@Q` \x01a5\x8A\x94\x93\x92\x91\x90aW\x1BV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra5\xA7`\x01a9bV[a5\xBE`\0\x80Q` aZ\x19\x839\x81Q\x91Ra9bV[a5\xD5`\0\x80Q` aY\xB9\x839\x81Q\x91Ra9bV[a5\xEC`\0\x80Q` aY\xF9\x839\x81Q\x91Ra9bV[a6\x03`\0\x80Q` aY9\x839\x81Q\x91Ra9bV[`@Q` \x01a6\x18\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa69\x90a8\x8BV[a6G\x85a\x01\0\x01Qa8\x8BV[a6U\x86a\x01 \x01Qa8\x8BV[a6c\x87a\x01@\x01Qa8\x8BV[a6q\x88a\x01`\x01Qa8\x8BV[a6\x7F\x89a\x01\x80\x01Qa8\x8BV[a6\x8D\x8Aa\x01\xE0\x01Qa8\x8BV[`@Q` \x01a6\xA4\x98\x97\x96\x95\x94\x93\x92\x91\x90aWrV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa6\xC6\x90a8\x8BV[a6\xD4\x85a\x02 \x01Qa8\x8BV[a6\xE2\x86a\x02@\x01Qa8\x8BV[a6\xF0\x87a\x01\xA0\x01Qa8\x8BV[a6\xFE\x88a\x01\xC0\x01Qa8\x8BV[a7\x0C\x89a\x02`\x01Qa8\x8BV[`@Q` \x01a7\"\x97\x96\x95\x94\x93\x92\x91\x90aX\x17V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa7A\x90a8\x8BV[a7N\x85``\x01Qa8\x8BV[a7[\x86`\x80\x01Qa8\x8BV[a7h\x87`\xA0\x01Qa8\x8BV[a7u\x88`\xC0\x01Qa8\x8BV[`@Q` \x01a7\x8A\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa7\xC1\x90\x84\x90`\0\x90a7\xB4Wa7\xB4aU!V[` \x02` \x01\x01Qa9bV[a7\xD7\x84`\x01\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a7\xED\x85`\x02\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8\x03\x86`\x03\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8\x19\x87`\x04\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8/\x88`\x05\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8E\x89`\x06\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8[\x8A`\x07\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[`@Q` \x01a8s\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aX\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a8\x98\x83a4\xE3V[\x15a8\xA4W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aX\xF9\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a8\xCAWP`\x01`\xFF\x1B[\x82Qa8\xD7\x90\x82\x17a9bV[`@Q` \x01a8\xE9\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a97W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a9\x1DV[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a(\x0C`\0\x80Q` aYy\x839\x81Q\x91R\x85aV\xF9V[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` aYy\x839\x81Q\x91R\x90\x83\x80\x15a:\xDDW\x84\x93P`\0[\x82\x81\x10\x15a:\xD1W\x83\x85\x86\t\x94P`\x01\x01a:\xBBV[P`\x01\x84\x03\x93Pa:\xE4V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a:\xFFWP`\x01a \xABV[\x81`\0\x03a;\x0FWP`\0a \xABV[`@\x84\x01Q`\0\x80Q` aYy\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a;?W`\x01\x87\x03\x92Pa;FV[`\x01\x84\x03\x92P[Pa;P\x82aC\xC2V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` aYy\x839\x81Q\x91R\x90\x83\x83\x03a;\xE2W`\x01`\0[\x82\x81\x10\x15a;\xD5W\x81\x87\x03a;\xB6W\x87\x81\x81Q\x81\x10a;\xA3Wa;\xA3aU!V[` \x02` \x01\x01Q\x94PPPPPa4\x88V[\x83\x80a;\xC4Wa;\xC4aV\xE3V[\x89``\x01Q\x83\t\x91P`\x01\x01a;\x82V[P`\0\x93PPPPa4\x88V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a;\xFC\x8D\x88aDhV[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a<\x18Wa<\x18aO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F\x86\x86\x86\x86\x85\x87aE-V[`\xC0\x85\x01Q\x82Q`\0\x80Q` aYy\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a>>Wa>>aU!V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a>bWa>baU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a>\x87Wa>\x87aU!V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a>\xABWa>\xABaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a>\xD0Wa>\xD0aU!V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a>\xF4Wa>\xF4aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10a?\x19Wa?\x19aU!V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10a?=Wa?=aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10a?bWa?baU!V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10a?\x86Wa?\x86aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10a?\xABWa?\xABaU!V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10a?\xCFWa?\xCFaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10a?\xF4Wa?\xF4aU!V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10a@\x18Wa@\x18aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10a@=Wa@=aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10a@aWa@aaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10a@\x86Wa@\x86aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10a@\xAAWa@\xAAaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10a@\xD3Wa@\xD3aU!V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10a@\xF7Wa@\xF7aU!V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` aYy\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aATW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aA#V[PP\x93\x92PPPV[aAeaO0V[aAmaOJV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aA\x9FW`\0\x80\xFD[P\x80aA\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\x08[V[PP\x92\x91PPV[aA\xF9aO0V[aB\x01aOhV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aB>W`\0\x80\xFD[P\x80aA\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[\x80Q\x15aB\x9CW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aB\xC3\x81`\x1FaU\x87V[\x10\x15aC\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\x08[V[aC\x0C\x82\x84aU\x87V[\x84Q\x10\x15aCPW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\x08[V[``\x82\x15\x80\x15aCoW`@Q\x91P`\0\x82R` \x82\x01`@RaC\xB9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aC\xA8W\x80Q\x83R` \x92\x83\x01\x92\x01aC\x90V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` aYy\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aDaW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aD\x8FW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aYy\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aD\xBDWaD\xBDaO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aD\xE6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a:\xE4W` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aE\"W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaE\x06V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aYy\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aZ\x19\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xB9\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xF9\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY9\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aF\\WaF\\aU!V[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aF{WaF{aU!V[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aG]WaG]aU!V[` \x90\x81\x02\x91\x90\x91\x01\x01RaGr\x85\x82aU\x0EV[\x87`\x01\x81Q\x81\x10aG\x85WaG\x85aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aG\xAAWaG\xAAaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aG\xCFWaG\xCFaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aG\xF4WaG\xF4aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aH\x19WaH\x19aU!V[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aH=WaH=aU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aHaWaHaaU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aH\x85WaH\x85aU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aH\xA9WaH\xA9aU!V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aH\xD8WaH\xD8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aH\xFDWaH\xFDaU!V[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aI,WaI,aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aIQWaIQaU!V[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aI\x8AWaI\x8AaU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aI\xAFWaI\xAFaU!V[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aI\xE8WaI\xE8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aJ\rWaJ\raU!V[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aJFWaJFaU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aJkWaJkaU!V[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aJ\xA4WaJ\xA4aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aJ\xC9WaJ\xC9aU!V[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aJ\xE5\x91\x90aU\x0EV[\x87`\x0C\x81Q\x81\x10aJ\xF8WaJ\xF8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aK\x1DWaK\x1DaU!V[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aK=WaK=aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aKbWaKbaU!V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aK\xB2WaK\xB2aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aK\xD7WaK\xD7aU!V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaK\xEE\x90\x82aU\x0EV[\x87`\x0F\x81Q\x81\x10aL\x01WaL\x01aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aL%WaL%aU!V[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aLkWaLkaU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aL\x8FWaL\x8FaU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aL\xBBWaL\xBBaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aL\xE0WaL\xE0aU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aM\x0CWaM\x0CaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aM1WaM1aU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aM]WaM]aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aM\x82WaM\x82aU!V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aN\x14aO0V[\x81R` \x01aN!aO0V[\x81R` \x01aN.aO0V[\x81R` \x01aN;aO0V[\x81R` \x01aNHaO0V[\x81R` \x01aNUaO0V[\x81R` \x01aNbaO0V[\x81R` \x01aNoaO0V[\x81R` \x01aN|aO0V[\x81R` \x01aN\x89aO0V[\x81R` \x01aN\x96aO0V[\x81R` \x01aN\xA3aO0V[\x81R` \x01aN\xB0aO0V[\x81R` \x01aN\xBDaO0V[\x81R` \x01aN\xCAaO0V[\x81R` \x01aN\xD7aO0V[\x81R` \x01aN\xE4aO0V[\x81R` \x01aN\xF1aO0V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aN\xE4[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aO\xAFW`\0\x80\xFD[a \xAB\x82aO\x86V[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\x05WaP\x05aO\xCCV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP3WaP3aO\xCCV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aPfW`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aP\x88WaP\x88aO\xCCV[\x81`@R\x80\x92PaP\x98\x84aP;V[\x81RaP\xA6` \x85\x01aP;V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aQ\x01W`\0\x80\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aQ#WaQ#aO\xCCV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aQRW`\0\x80\xFD[aQ\\\x85\x85aPRV[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aQuW`\0\x80\xFD[aQ}aO\xE2V[\x92PaQ\x8B\x87\x83\x88\x01aP\xEFV[\x83Ra\x01@aQ\x9C\x88\x82\x89\x01aP\xEFV[` \x85\x01Ra\x01\x80aQ\xB0\x89\x82\x8A\x01aP\xEFV[`@\x86\x01Ra\x01\xC0aQ\xC4\x8A\x82\x8B\x01aP\xEFV[``\x87\x01Ra\x02\0aQ\xD8\x8B\x82\x8C\x01aP\xEFV[`\x80\x88\x01Ra\x02@aQ\xEC\x8C\x82\x8D\x01aP\xEFV[`\xA0\x89\x01Ra\x02\x80aR\0\x8D\x82\x8E\x01aP\xEFV[`\xC0\x8A\x01Ra\x02\xC0aR\x14\x8E\x82\x8F\x01aP\xEFV[`\xE0\x8B\x01RaR'\x8Ea\x03\0\x8F\x01aP\xEFV[\x89\x8B\x01RaR9\x8Ea\x03@\x8F\x01aP\xEFV[a\x01 \x8B\x01RaRM\x8Ea\x03\x80\x8F\x01aP\xEFV[\x87\x8B\x01RaR_\x8Ea\x03\xC0\x8F\x01aP\xEFV[a\x01`\x8B\x01RaRs\x8Ea\x04\0\x8F\x01aP\xEFV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aS\nW`\0\x80\xFD[aS\x13\x83aO\x86V[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aS0W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aSDW`\0\x80\xFD[\x815\x81\x81\x11\x15aSVWaSVaO\xCCV[aSh`\x1F\x82\x01`\x1F\x19\x16\x85\x01aP\x0BV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aS~W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\xD6W`\0\x80\xFD[a \xAB\x82aS\xB0V[`\0` \x82\x84\x03\x12\x15aS\xF1W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aT\x0EW`\0\x80\xFD[aT\x18\x85\x85aPRV[\x92PaT'a\x01\0\x85\x01aS\xB0V[\x91PaT6a\x01 \x85\x01aO\x86V[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aTRW`\0\x80\xFD[a \xAB\x83\x83aPRV[`\0[\x83\x81\x10\x15aTwW\x81\x81\x01Q\x83\x82\x01R` \x01aT_V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaT\x9F\x81`@\x85\x01` \x87\x01aT\\V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aT\xC6W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aA\xE9WaA\xE9aT\xD5V[\x81\x81\x03\x81\x81\x11\x15a\x10\x1AWa\x10\x1AaT\xD5V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81aUFWaUFaT\xD5V[P`\0\x19\x01\x90V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a2\x15Wa2\x15aT\xD5V[`\0` \x82\x84\x03\x12\x15aU\x80W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x10\x1AWa\x10\x1AaT\xD5V[`\0\x82QaU\xAC\x81\x84` \x87\x01aT\\V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aU\xC9\x82\x85\x83\x8D\x01aT\\V[\x88Q\x91\x84\x01\x91aU\xDC\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aU\xEE\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aV\0\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aV\x12\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aV$\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaVG\x81\x84` \x88\x01aT\\V[\x83Q\x90\x83\x01\x90aV[\x81\x83` \x88\x01aT\\V[\x01\x94\x93PPPPV[`\0\x87QaVv\x81\x84` \x8C\x01aT\\V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84QaV\xB2\x81\x84` \x89\x01aT\\V[\x84Q\x90\x83\x01\x90aV\xC6\x81\x83` \x89\x01aT\\V[\x84Q\x91\x01\x90aV\xD9\x81\x83` \x88\x01aT\\V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82aW\x16WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85QaW-\x81\x84` \x8A\x01aT\\V[\x85Q\x90\x83\x01\x90aWA\x81\x83` \x8A\x01aT\\V[\x85Q\x91\x01\x90aWT\x81\x83` \x89\x01aT\\V[\x84Q\x91\x01\x90aWg\x81\x83` \x88\x01aT\\V[\x01\x96\x95PPPPPPV[`\0\x89Q` aW\x85\x82\x85\x83\x8F\x01aT\\V[\x8AQ\x91\x84\x01\x91aW\x98\x81\x84\x84\x8F\x01aT\\V[\x8AQ\x92\x01\x91aW\xAA\x81\x84\x84\x8E\x01aT\\V[\x89Q\x92\x01\x91aW\xBC\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aW\xCE\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aW\xE0\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aW\xF2\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aX\x04\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` aX*\x82\x85\x83\x8E\x01aT\\V[\x89Q\x91\x84\x01\x91aX=\x81\x84\x84\x8E\x01aT\\V[\x89Q\x92\x01\x91aXO\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aXa\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aXs\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aX\x85\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aX\x97\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQaX\xBB\x81\x84` \x8F\x01aT\\V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0B\xCDa\x0FeV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\x0CCW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x0C\x7Fa\x0FeV[a\x0Cu`\0a\x16>V[a\x0C\xE5`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFFh\x01\0\0\0\0\0\0\0\0\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\r\xBEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\r\xDBWP0;\x15[\x90P\x81\x15\x80\x15a\r\xE9WP\x80\x15[\x15a\x0E W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0EkW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x0Et\x86a\x16\xC7V[a\x0E|a\x16\xD8V[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x90Ua\x0E\xB9\x88\x88a\x16\xE0V[\x83\x15a\x0F\x04W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x0F\x16a\x0FeV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0FYW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\tBV[a\x0Fb\x81a\x16>V[PV[3a\x0F\x97\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0CuW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\tBV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0B\x92W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[`\0\x80Th\x01\0\0\0\0\0\0\0\0\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x11C\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aY\xBAV[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x07=V[`\0a\x11\xB5a\x19\xD0V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x11\xF4Wa\x11\xF4aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x12\"Wa\x12\"aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x12PWa\x12PaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x12tWa\x12taY\xDBV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x12\x98Wa\x12\x98aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x12\xE1Wa\x12\xE1aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x13*Wa\x13*aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x13rWa\x13raY\xDBV[` \x02` \x01\x01\x81\x81RPPa\x13\x89\x82\x82\x85a\x1F\xB2V[a\x13\xBFW`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x14^WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x14R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\x9Da\x0FeV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07=V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x150WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15-\x91\x81\x01\x90aY\xF1V[`\x01[a\x15qW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x15\xCDW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\tBV[a\x15\xD7\x83\x83a \x9DV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x16\xCFa \xF3V[a\x0Fb\x81a!ZV[a\x0Cua \xF3V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x17\x06WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x17\x13WP`\x80\x82\x01Q\x15[\x80a\x17 WP`\xA0\x82\x01Q\x15[\x80a\x17-WP`\xC0\x82\x01Q\x15[\x80a\x17:WP`\xE0\x82\x01Q\x15[\x80a\x17IWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17\x80W`@Q\x7F\xA1\xBA\x07\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19\xB3\x83`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x19\xD8aQcV[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xBD\x82a!bV[a\x1F\xE0\x83`\0\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[` \x02` \x01\x01Qa\x0F\xD9V[a\x1F\xF6\x83`\x01\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a \x0C\x83`\x02\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a \"\x83`\x03\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a 8\x83`\x04\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a N\x83`\x05\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a d\x83`\x06\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[a z\x83`\x07\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDBV[`\0a \x87\x85\x85\x85a\"\x9AV[\x90Pa \x92\x81a$\x1BV[\x91PP[\x93\x92PPPV[a \xA6\x82a(\xE3V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a \xEBWa\x15\xD7\x82\x82a)\x8BV[a\x0B\x92a*\x03V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x0CuW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x16a \xF3V[\x80Qa!m\x90a*;V[a!z\x81` \x01Qa*;V[a!\x87\x81`@\x01Qa*;V[a!\x94\x81``\x01Qa*;V[a!\xA1\x81`\x80\x01Qa*;V[a!\xAE\x81`\xA0\x01Qa*;V[a!\xBB\x81`\xC0\x01Qa*;V[a!\xC8\x81`\xE0\x01Qa*;V[a!\xD6\x81a\x01\0\x01Qa*;V[a!\xE4\x81a\x01 \x01Qa*;V[a!\xF2\x81a\x01@\x01Qa*;V[a\"\0\x81a\x01`\x01Qa*;V[a\"\x0E\x81a\x01\x80\x01Qa*;V[a\"\x1C\x81a\x01\xA0\x01Qa\x0F\xD9V[a\"*\x81a\x01\xC0\x01Qa\x0F\xD9V[a\"8\x81a\x01\xE0\x01Qa\x0F\xD9V[a\"F\x81a\x02\0\x01Qa\x0F\xD9V[a\"T\x81a\x02 \x01Qa\x0F\xD9V[a\"b\x81a\x02@\x01Qa\x0F\xD9V[a\"p\x81a\x02`\x01Qa\x0F\xD9V[a\"~\x81a\x02\x80\x01Qa\x0F\xD9V[a\"\x8C\x81a\x02\xA0\x01Qa\x0F\xD9V[a\x0Fb\x81a\x02\xC0\x01Qa\x0F\xD9V[a\"\xA2aS\xE1V[\x83` \x01Q\x83Q\x14a\"\xE0W`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xED\x85\x85\x85a*\xE5V[\x90P`\0a\"\xFE\x86`\0\x01Qa.\x16V[\x90P`\0a#\x11\x82\x84`\xA0\x01Q\x88a1\xFAV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a#TW\x90PP\x90P`\0a#\x8D\x8A\x85\x8A\x89\x87\x87a2ZV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\xA1W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$\xE4Wa$\xE4aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a%\x08Wa%\x08aY\xDBV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a%+Wa%+aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a%OWa%OaY\xDBV[` \x02` \x01\x01\x81\x90RPa%d\x82\x84a2\x8FV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a%\x83\x82`\x02aZ\nV[a%\x8E\x90`\x01aZ\nV[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xA9Wa%\xA9aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\xD2W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xEEWa%\xEEaT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&3W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x0CW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&\xD7W\x89`\x80\x01Q\x81\x81Q\x81\x10a&aWa&aaY\xDBV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a&{Wa&{aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a&\x9DWa&\x9DaY\xDBV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\xB7Wa&\xB7aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xCD`\x01\x83aZ\nV[\x91P`\x01\x01a&>V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&\xEFWa&\xEFaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a'\x12Wa'\x12aY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'(`\x01\x82aZ\nV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a'NWa'NaY\xDBV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a'tWa'taY\xDBV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\x8A`\x01\x82aZ\nV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa'\xA2\x82a3\x89V[\x84\x82\x81Q\x81\x10a'\xB4Wa'\xB4aY\xDBV[` \x02` \x01\x01\x81\x81RPPa'\xEC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a'\xFEWa'\xFEaY\xDBV[` \x02` \x01\x01\x81\x90RPa(\x1Ba(\x16\x84\x86a2\x8FV[a3\xDFV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\xD9\x83\x82\x84a(\xD4a4~V[a5OV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a)2W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa)\xA8\x91\x90aZ\x1DV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a)\xE3W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a)\xE8V[``\x91P[P\x91P\x91Pa)\xF8\x85\x83\x83a63V[\x92PPP[\x92\x91PPV[4\x15a\x0CuW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a*uWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[a+-`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a+n\x82\x87\x87a6\xA8V[\x81Q\x84Qa+{\x90a:\x89V[a+\x88\x86` \x01Qa:\x89V[a+\x95\x87`@\x01Qa:\x89V[a+\xA2\x88``\x01Qa:\x89V[a+\xAF\x89`\x80\x01Qa:\x89V[`@Q` \x01a+\xC4\x96\x95\x94\x93\x92\x91\x90aZ9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+\xDF\x82a;LV[Pa+\xE9\x82a;LV[``\x84\x01Ra+\xF7\x82a;LV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\x0C\x90a:\x89V[`@Q` \x01a,\x1D\x92\x91\x90aZ\xB8V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,8\x82a;LV[\x83R\x81Q`\xC0\x85\x01Qa,J\x90a:\x89V[a,W\x86`\xE0\x01Qa:\x89V[a,e\x87a\x01\0\x01Qa:\x89V[a,s\x88a\x01 \x01Qa:\x89V[a,\x81\x89a\x01@\x01Qa:\x89V[`@Q` \x01a,\x96\x96\x95\x94\x93\x92\x91\x90aZ9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xB1\x82a;LV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa,\xC7\x90a;\xC0V[a,\xD5\x86a\x01\xC0\x01Qa;\xC0V[a,\xE3\x87a\x01\xE0\x01Qa;\xC0V[a,\xF1\x88a\x02\0\x01Qa;\xC0V[a,\xFF\x89a\x02 \x01Qa;\xC0V[`@Q` \x01a-\x14\x96\x95\x94\x93\x92\x91\x90aZ\xE7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-6\x90a;\xC0V[a-D\x86a\x02`\x01Qa;\xC0V[a-R\x87a\x02\x80\x01Qa;\xC0V[a-`\x88a\x02\xA0\x01Qa;\xC0V[a-n\x89a\x02\xC0\x01Qa;\xC0V[`@Q` \x01a-\x83\x96\x95\x94\x93\x92\x91\x90aZ\xE7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\x9E\x82a;LV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa-\xB4\x90a:\x89V[a-\xC2\x86a\x01\x80\x01Qa:\x89V[`@Q` \x01a-\xD4\x93\x92\x91\x90a[#V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xEF\x82a;LV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.H`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a.\xDCWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a/qWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a0\x9BWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a10WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a1\xC3WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\x1E`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2(\x84\x84a=\x0CV[\x80\x82Ra28\x90\x85\x90\x85\x90a=rV[` \x82\x01R\x80Qa2N\x90\x85\x90\x84\x90\x86\x90a=\xF8V[`@\x82\x01R\x93\x92PPPV[`\0\x80a2h\x85\x87\x89a?\xBFV[\x90Pa2x\x88\x86\x89\x89\x88\x88a@\xBDV[a2\x83\x81\x87\x86aC\xDBV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a2\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\tBV[a32\x83`\0\x81Q\x81\x10a3\nWa3\naY\xDBV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3%Wa3%aY\xDBV[` \x02` \x01\x01QaD=V[\x90P`\x01[\x82Q\x81\x10\x15a3\x82Wa3x\x82a3s\x86\x84\x81Q\x81\x10a3YWa3YaY\xDBV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3%Wa3%aY\xDBV[aD\xE1V[\x91P`\x01\x01a37V[P\x92\x91PPV[`\0a3\xB5\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a[|V[a)\xFD\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a[\x9EV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a4\x07WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa4L\x91\x90a[|V[a4v\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa[\x9EV[\x90R\x92\x91PPV[a4\xA9`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a6%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\tBV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a6HWa6C\x82aE\x88V[a \x96V[\x81Q\x15\x80\x15a6_WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a6\xA1W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\tBV[P\x80a \x96V[\x82Q`\xFE\x90a6\xE3a6\xB9\x83a;\xC0V[`@Q` \x01a6\xCB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aE\xCAV[a7\x1Da6\xF3\x86`\0\x01Qa;\xC0V[`@Q` \x01a7\x05\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aE\xCAV[a7-a6\xF3\x87` \x01Qa;\xC0V[`@Q` \x01a7@\x94\x93\x92\x91\x90a[\xB1V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra7]`\x01a;\xC0V[a7\x86\x7F/\x8D\xD1\xF1\xA7X\x8BW`\x01`\0[\x82\x81\x10\x15a>~W\x81\x87\x03a>_W\x87\x81\x81Q\x81\x10a>LWa>LaY\xDBV[` \x02` \x01\x01Q\x94PPPPPa6+V[\x83\x80a>mWa>ma[fV[\x89``\x01Q\x83\t\x91P`\x01\x01a>+V[P`\0\x93PPPPa6+V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\xA5\x8D\x88aG\xAAV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a>\xC2Wa>\xC2aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xEBW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?0W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xFBV[Pa?:\x83aF\xF2V[\x92P`\0[\x88\x81\x10\x15a?\xADW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?\x8CW\x80\x82\x14a?\x84W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?bV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a??V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\xCB\x86\x86\x86\x86\x85\x87aH\x9BV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aA\x0CWaA\x0CaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aA0WaA0aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aAUWaAUaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aAyWaAyaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA\x9EWaA\x9EaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\xC2WaA\xC2aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xE7WaA\xE7aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aB\x0BWaB\x0BaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aB0WaB0aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aBTWaBTaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aByWaByaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB\x9DWaB\x9DaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\xC2WaB\xC2aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xE6WaB\xE6aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aC\x0BWaC\x0BaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aC/WaC/aY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aCTWaCTaY\xDBV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aCxWaCxaY\xDBV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aC\xA1WaC\xA1aY\xDBV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\xC5WaC\xC5aY\xDBV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aD4W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\x03V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaDYaT4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\x8BW`\0\x80\xFD[P\x80aD\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaD\xFDaTRV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aE:W`\0\x80\xFD[P\x80aD\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\tBV[\x80Q\x15aE\x98W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aE\xD8\x81`\x1FaZ\nV[\x10\x15aF&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[aF0\x82\x84aZ\nV[\x84Q\x10\x15aF\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[``\x82\x15\x80\x15aF\x9FW`@Q\x91P`\0\x82R` \x82\x01`@RaF\xE9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01aF\xC0V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aG\xA3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\xEAW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH+WaH+aT\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aHTW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=iW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aH\x90W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaHtV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7XW`\0\x80\xFD[\x815\x81\x81\x11\x15aXPWaXPaT\xA2V[aXb\x84`\x1F\x19`\x1F\x84\x01\x16\x01aT\xE2V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aXxW`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xBCW`\0\x80\xFD[a \x96\x82aX\x96V[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aX\xDBW`\0\x80\xFD[aX\xE5\x85\x85aU+V[\x92PaX\xF4a\x01\0\x85\x01aX\x96V[\x91PaY\x03a\x01 \x85\x01aTpV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aY\x1FW`\0\x80\xFD[a \x96\x83\x83aU+V[`\0[\x83\x81\x10\x15aYDW\x81\x81\x01Q\x83\x82\x01R` \x01aY,V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaYl\x81`@\x85\x01` \x87\x01aY)V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aD\xD9WaD\xD9aY\x80V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a3\x82Wa3\x82aY\x80V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15aZ\x03W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a)\xFDWa)\xFDaY\x80V[`\0\x82QaZ/\x81\x84` \x87\x01aY)V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZL\x82\x85\x83\x8D\x01aY)V[\x88Q\x91\x84\x01\x91aZ_\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91aZq\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91aZ\x83\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91aZ\x95\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91aZ\xA7\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaZ\xCA\x81\x84` \x88\x01aY)V[\x83Q\x90\x83\x01\x90aZ\xDE\x81\x83` \x88\x01aY)V[\x01\x94\x93PPPPV[`\0\x87QaZ\xF9\x81\x84` \x8C\x01aY)V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[5\x81\x84` \x89\x01aY)V[\x84Q\x90\x83\x01\x90a[I\x81\x83` \x89\x01aY)V[\x84Q\x91\x01\x90a[\\\x81\x83` \x88\x01aY)V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\x99WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a)\xFDWa)\xFDaY\x80V[`\0\x85Qa[\xC3\x81\x84` \x8A\x01aY)V[\x85Q\x90\x83\x01\x90a[\xD7\x81\x83` \x8A\x01aY)V[\x85Q\x91\x01\x90a[\xEA\x81\x83` \x89\x01aY)V[\x84Q\x91\x01\x90a[\xFD\x81\x83` \x88\x01aY)V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\\x1B\x82\x85\x83\x8F\x01aY)V[\x8AQ\x91\x84\x01\x91a\\.\x81\x84\x84\x8F\x01aY)V[\x8AQ\x92\x01\x91a\\@\x81\x84\x84\x8E\x01aY)V[\x89Q\x92\x01\x91a\\R\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91a\\d\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91a\\v\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91a\\\x88\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91a\\\x9A\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a\\\xC0\x82\x85\x83\x8E\x01aY)V[\x89Q\x91\x84\x01\x91a\\\xD3\x81\x84\x84\x8E\x01aY)V[\x89Q\x92\x01\x91a\\\xE5\x81\x84\x84\x8D\x01aY)V[\x88Q\x92\x01\x91a\\\xF7\x81\x84\x84\x8C\x01aY)V[\x87Q\x92\x01\x91a]\t\x81\x84\x84\x8B\x01aY)V[\x86Q\x92\x01\x91a]\x1B\x81\x84\x84\x8A\x01aY)V[\x85Q\x92\x01\x91a]-\x81\x84\x84\x89\x01aY)V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]Q\x81\x84` \x8F\x01aY)V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01RW`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01WW\x80c\r\x8En,\x14a\x01yW\x80c1=\xF7\xB1\x14a\x01\xABW\x80c8+!Z\x14a\x01\xD8W\x80c@\x999\xB7\x14a\x01\xFCW\x80cHG\xAE]\x14a\x02\x1CW\x80cO\x1E\xF2\x86\x14a\x02\x9EW\x80cR\xD1\x90-\x14a\x02\xB1W\x80cTd`\x85\x14a\x02\xC6W\x80cb\x82w3\x14a\x02\xDBW\x80ci\xCCj\x04\x14a\x02\xF1W\x80cpS\xFCQ\x14a\x03\x06W\x80cqP\x18\xA6\x14a\x03\x1BW\x80cvg\x18\x08\x14a\x030W\x80cv\xB6\xB7\xCB\x14a\x03dW\x80c\x7F\x17\xBA\xAD\x14a\x03zW\x80c\x82\xD0\x7F\xF3\x14a\x04-W\x80c\x85\x84\xD2?\x14a\x04BW\x80c\x8D\xA5\xCB[\x14a\x04\x86W\x80c\xA2D\xD5\x96\x14a\x04\x9BW\x80c\xA5\x1Eo\xEA\x14a\x04\xBBW\x80c\xAA\x92'2\x14a\x04\xDBW\x80c\xAD<\xB1\xCC\x14a\x04\xFBW\x80c\xBD2Q\x9A\x14a\x059W\x80c\xCAo\xE8U\x14a\x05jW\x80c\xDB\x13\xB6\n\x14a\x05\x80W\x80c\xE003\x01\x14a\x05\xBFW\x80c\xF0h T\x14a\x05\xDFW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x11W[`\0\x80\xFD[4\x80\x15a\x01cW`\0\x80\xFD[Pa\x01wa\x01r6`\x04aO\x9DV[a\x061V[\0[4\x80\x15a\x01\x85W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB7W`\0\x80\xFD[P`\x06Ta\x01\xCB\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xA2\x91\x90aO\xB8V[4\x80\x15a\x01\xE4W`\0\x80\xFD[Pa\x01\xEE`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xA2V[4\x80\x15a\x02\x08W`\0\x80\xFD[Pa\x01wa\x02\x176`\x04aQ=V[a\x06\xF1V[4\x80\x15a\x02(W`\0\x80\xFD[Pa\x021a\n\x1CV[`@Qa\x01\xA2\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01wa\x02\xAC6`\x04aR\xF7V[a\n\xAEV[4\x80\x15a\x02\xBDW`\0\x80\xFD[Pa\x01\xEEa\n\xCDV[4\x80\x15a\x02\xD2W`\0\x80\xFD[P`\x08Ta\x01\xEEV[4\x80\x15a\x02\xE7W`\0\x80\xFD[Pa\x01\xEE`\x02T\x81V[4\x80\x15a\x02\xFDW`\0\x80\xFD[Pa\x01wa\n\xEAV[4\x80\x15a\x03\x12W`\0\x80\xFD[P`\x07Ta\x01\xEEV[4\x80\x15a\x03'W`\0\x80\xFD[Pa\x01wa\x0BZV[4\x80\x15a\x03F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xD4a\x10^V[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x06\xE6\x91\x90aO\xB8V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x15]WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15Z\x91\x81\x01\x90aUnV[`\x01[a\x15|W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[`\0\x80Q` aYY\x839\x81Q\x91R\x81\x14a\x15\xADW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x08[V[a\x15\xB7\x83\x83a \xB2V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0BXW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x16\x0Fa\x16aV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x16\xB1a!\x08V[a\x10[\x81a!-V[a\x0BXa!\x08V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xE6WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xF3WP`\x80\x82\x01Q\x15[\x80a\x17\0WP`\xA0\x82\x01Q\x15[\x80a\x17\rWP`\xC0\x82\x01Q\x15[\x80a\x17\x1AWP`\xE0\x82\x01Q\x15[\x80a\x17)WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17GW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19-\x83a\x0E\xBDV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` aY\x19\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` aY\x99\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` aY\xD9\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x19\xEDaM\xF2V[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xD2\x82a!5V[a\x1F\xF5\x83`\0\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[` \x02` \x01\x01Qa\x10\x90V[a \x0B\x83`\x01\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a !\x83`\x02\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a 7\x83`\x03\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a M\x83`\x04\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a c\x83`\x05\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a y\x83`\x06\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[a \x8F\x83`\x07\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU!V[`\0a \x9C\x85\x85\x85a\"mV[\x90Pa \xA7\x81a#\xB7V[\x91PP[\x93\x92PPPV[a \xBB\x82a(\x16V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\0Wa\x15\xB7\x82\x82a(rV[a\n\xC9a(\xE8V[a!\x10a)\x07V[a\x0BXW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10(a!\x08V[\x80Qa!@\x90a)!V[a!M\x81` \x01Qa)!V[a!Z\x81`@\x01Qa)!V[a!g\x81``\x01Qa)!V[a!t\x81`\x80\x01Qa)!V[a!\x81\x81`\xA0\x01Qa)!V[a!\x8E\x81`\xC0\x01Qa)!V[a!\x9B\x81`\xE0\x01Qa)!V[a!\xA9\x81a\x01\0\x01Qa)!V[a!\xB7\x81a\x01 \x01Qa)!V[a!\xC5\x81a\x01@\x01Qa)!V[a!\xD3\x81a\x01`\x01Qa)!V[a!\xE1\x81a\x01\x80\x01Qa)!V[a!\xEF\x81a\x01\xA0\x01Qa\x10\x90V[a!\xFD\x81a\x01\xC0\x01Qa\x10\x90V[a\"\x0B\x81a\x01\xE0\x01Qa\x10\x90V[a\"\x19\x81a\x02\0\x01Qa\x10\x90V[a\"'\x81a\x02 \x01Qa\x10\x90V[a\"5\x81a\x02@\x01Qa\x10\x90V[a\"C\x81a\x02`\x01Qa\x10\x90V[a\"Q\x81a\x02\x80\x01Qa\x10\x90V[a\"_\x81a\x02\xA0\x01Qa\x10\x90V[a\x10[\x81a\x02\xC0\x01Qa\x10\x90V[a\"uaN\xF6V[\x83` \x01Q\x83Q\x14a\"\x9AW`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xA7\x85\x85\x85a)\xAFV[\x90P`\0a\"\xB8\x86`\0\x01Qa,\xCEV[\x90P`\0a\"\xCB\x82\x84`\xA0\x01Q\x88a0\x99V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a#\x16aO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a#\x0EW\x90PP\x90P`\0a#;\x8A\x85\x8A\x89\x87\x87a0\xF9V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aYy\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` aYy\x839\x81Q\x91Ra#\xD0aO0V[a#\xD8aO0V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a$\x1AaO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\x12W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$IWa$IaU!V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a$mWa$maU!V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a$\x90Wa$\x90aU!V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a$\xB4Wa$\xB4aU!V[` \x02` \x01\x01\x81\x90RPa$\xC9\x82\x84a1.V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a$\xE8\x82`\x02aU\x87V[a$\xF3\x90`\x01aU\x87V[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%\rWa%\raO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%QWa%QaO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\x8AW\x81` \x01[a%waO0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%oW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&.W\x89`\x80\x01Q\x81\x81Q\x81\x10a%\xB8Wa%\xB8aU!V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a%\xD2Wa%\xD2aU!V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a%\xF4Wa%\xF4aU!V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\x0EWa&\x0EaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&$`\x01\x83aU\x87V[\x91P`\x01\x01a%\x95V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&FWa&FaU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a&iWa&iaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\x7F`\x01\x82aU\x87V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a&\xA5Wa&\xA5aU!V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a&\xCBWa&\xCBaU!V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xE1`\x01\x82aU\x87V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa&\xF9\x82a2\x1CV[\x84\x82\x81Q\x81\x10a'\x0BWa'\x0BaU!V[` \x02` \x01\x01\x81\x81RPPa'\x1Fa2NV[\x83\x82\x81Q\x81\x10a'1Wa'1aU!V[` \x02` \x01\x01\x81\x90RPa'Na'I\x84\x86a1.V[a2oV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\x0C\x83\x82\x84a(\x07a2\xDCV[a3\xADV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a(CW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[`\0\x80Q` aYY\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa(\x8F\x91\x90aU\x9AV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a(\xCAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a(\xCFV[``\x91P[P\x91P\x91Pa(\xDF\x85\x83\x83a4\x90V[\x95\x94PPPPPV[4\x15a\x0BXW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a)\x11a\x16\x85V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` aX\xF9\x839\x81Q\x91Ra);\x83a4\xE3V[\x15a)EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xB7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\x08[V[a)\xF7`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` aYy\x839\x81Q\x91Ra*&\x82\x87\x87a4\xF2V[\x81Q\x84Qa*3\x90a8\x8BV[a*@\x86` \x01Qa8\x8BV[a*M\x87`@\x01Qa8\x8BV[a*Z\x88``\x01Qa8\x8BV[a*g\x89`\x80\x01Qa8\x8BV[`@Q` \x01a*|\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\x97\x82a9\0V[Pa*\xA1\x82a9\0V[``\x84\x01Ra*\xAF\x82a9\0V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa*\xC4\x90a8\x8BV[`@Q` \x01a*\xD5\x92\x91\x90aV5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\xF0\x82a9\0V[\x83R\x81Q`\xC0\x85\x01Qa+\x02\x90a8\x8BV[a+\x0F\x86`\xE0\x01Qa8\x8BV[a+\x1D\x87a\x01\0\x01Qa8\x8BV[a++\x88a\x01 \x01Qa8\x8BV[a+9\x89a\x01@\x01Qa8\x8BV[`@Q` \x01a+N\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+i\x82a9\0V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa+\x7F\x90a9bV[a+\x8D\x86a\x01\xC0\x01Qa9bV[a+\x9B\x87a\x01\xE0\x01Qa9bV[a+\xA9\x88a\x02\0\x01Qa9bV[a+\xB7\x89a\x02 \x01Qa9bV[`@Q` \x01a+\xCC\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa+\xEE\x90a9bV[a+\xFC\x86a\x02`\x01Qa9bV[a,\n\x87a\x02\x80\x01Qa9bV[a,\x18\x88a\x02\xA0\x01Qa9bV[a,&\x89a\x02\xC0\x01Qa9bV[`@Q` \x01a,;\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,V\x82a9\0V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa,l\x90a8\x8BV[a,z\x86a\x01\x80\x01Qa8\x8BV[`@Q` \x01a,\x8C\x93\x92\x91\x90aV\xA0V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xA7\x82a9\0V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a-\0`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a-\x94WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a.)WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a.\xBEWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a/SWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a/\xE8WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a0{WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a0\xBD`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a0\xC7\x84\x84a:\x99V[\x80\x82Ra0\xD7\x90\x85\x90\x85\x90a:\xEDV[` \x82\x01R\x80Qa0\xED\x90\x85\x90\x84\x90\x86\x90a;aV[`@\x82\x01R\x93\x92PPPV[`\0\x80a1\x07\x85\x87\x89a=\x15V[\x90Pa1\x17\x88\x86\x89\x89\x88\x88a>\x01V[a1\"\x81\x87\x86aA\rV[\x98\x97PPPPPPPPV[a16aO0V[\x82Q\x82Q\x14a1\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\x08[V[a1\xC5\x83`\0\x81Q\x81\x10a1\x9DWa1\x9DaU!V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a1\xB8Wa1\xB8aU!V[` \x02` \x01\x01QaA]V[\x90P`\x01[\x82Q\x81\x10\x15a2\x15Wa2\x0B\x82a2\x06\x86\x84\x81Q\x81\x10a1\xECWa1\xECaU!V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a1\xB8Wa1\xB8aU!V[aA\xF1V[\x91P`\x01\x01a1\xCAV[P\x92\x91PPV[`\0a26`\0\x80Q` aYy\x839\x81Q\x91R\x83aV\xF9V[a\x10\x1A\x90`\0\x80Q` aYy\x839\x81Q\x91RaU\x0EV[a2VaO0V[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a2waO0V[a2\x80\x82a4\xE3V[\x15a2\x89WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aX\xF9\x839\x81Q\x91R\x84` \x01Qa2\xBC\x91\x90aV\xF9V[a2\xD4\x90`\0\x80Q` aX\xF9\x839\x81Q\x91RaU\x0EV[\x90R\x92\x91PPV[a3\x07`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a4\x82W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\x08[V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a4\xA5Wa4\xA0\x82aB\x8CV[a \xABV[\x81Q\x15\x80\x15a4\xBCWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a4\xDCW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xB8V[P\x80a \xABV[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a5-a5\x03\x83a9bV[`@Q` \x01a5\x15\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aB\xB5V[a5ga5=\x86`\0\x01Qa9bV[`@Q` \x01a5O\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aB\xB5V[a5wa5=\x87` \x01Qa9bV[`@Q` \x01a5\x8A\x94\x93\x92\x91\x90aW\x1BV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra5\xA7`\x01a9bV[a5\xBE`\0\x80Q` aZ\x19\x839\x81Q\x91Ra9bV[a5\xD5`\0\x80Q` aY\xB9\x839\x81Q\x91Ra9bV[a5\xEC`\0\x80Q` aY\xF9\x839\x81Q\x91Ra9bV[a6\x03`\0\x80Q` aY9\x839\x81Q\x91Ra9bV[`@Q` \x01a6\x18\x96\x95\x94\x93\x92\x91\x90aVdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa69\x90a8\x8BV[a6G\x85a\x01\0\x01Qa8\x8BV[a6U\x86a\x01 \x01Qa8\x8BV[a6c\x87a\x01@\x01Qa8\x8BV[a6q\x88a\x01`\x01Qa8\x8BV[a6\x7F\x89a\x01\x80\x01Qa8\x8BV[a6\x8D\x8Aa\x01\xE0\x01Qa8\x8BV[`@Q` \x01a6\xA4\x98\x97\x96\x95\x94\x93\x92\x91\x90aWrV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa6\xC6\x90a8\x8BV[a6\xD4\x85a\x02 \x01Qa8\x8BV[a6\xE2\x86a\x02@\x01Qa8\x8BV[a6\xF0\x87a\x01\xA0\x01Qa8\x8BV[a6\xFE\x88a\x01\xC0\x01Qa8\x8BV[a7\x0C\x89a\x02`\x01Qa8\x8BV[`@Q` \x01a7\"\x97\x96\x95\x94\x93\x92\x91\x90aX\x17V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa7A\x90a8\x8BV[a7N\x85``\x01Qa8\x8BV[a7[\x86`\x80\x01Qa8\x8BV[a7h\x87`\xA0\x01Qa8\x8BV[a7u\x88`\xC0\x01Qa8\x8BV[`@Q` \x01a7\x8A\x96\x95\x94\x93\x92\x91\x90aU\xB6V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa7\xC1\x90\x84\x90`\0\x90a7\xB4Wa7\xB4aU!V[` \x02` \x01\x01Qa9bV[a7\xD7\x84`\x01\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a7\xED\x85`\x02\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8\x03\x86`\x03\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8\x19\x87`\x04\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8/\x88`\x05\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8E\x89`\x06\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[a8[\x8A`\x07\x81Q\x81\x10a7\xB4Wa7\xB4aU!V[`@Q` \x01a8s\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aX\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a8\x98\x83a4\xE3V[\x15a8\xA4W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aX\xF9\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a8\xCAWP`\x01`\xFF\x1B[\x82Qa8\xD7\x90\x82\x17a9bV[`@Q` \x01a8\xE9\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a97W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a9\x1DV[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a(\x0C`\0\x80Q` aYy\x839\x81Q\x91R\x85aV\xF9V[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` aYy\x839\x81Q\x91R\x90\x83\x80\x15a:\xDDW\x84\x93P`\0[\x82\x81\x10\x15a:\xD1W\x83\x85\x86\t\x94P`\x01\x01a:\xBBV[P`\x01\x84\x03\x93Pa:\xE4V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a:\xFFWP`\x01a \xABV[\x81`\0\x03a;\x0FWP`\0a \xABV[`@\x84\x01Q`\0\x80Q` aYy\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a;?W`\x01\x87\x03\x92Pa;FV[`\x01\x84\x03\x92P[Pa;P\x82aC\xC2V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` aYy\x839\x81Q\x91R\x90\x83\x83\x03a;\xE2W`\x01`\0[\x82\x81\x10\x15a;\xD5W\x81\x87\x03a;\xB6W\x87\x81\x81Q\x81\x10a;\xA3Wa;\xA3aU!V[` \x02` \x01\x01Q\x94PPPPPa4\x88V[\x83\x80a;\xC4Wa;\xC4aV\xE3V[\x89``\x01Q\x83\t\x91P`\x01\x01a;\x82V[P`\0\x93PPPPa4\x88V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a;\xFC\x8D\x88aDhV[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a<\x18Wa<\x18aO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F\x86\x86\x86\x86\x85\x87aE-V[`\xC0\x85\x01Q\x82Q`\0\x80Q` aYy\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a>>Wa>>aU!V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a>bWa>baU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a>\x87Wa>\x87aU!V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a>\xABWa>\xABaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a>\xD0Wa>\xD0aU!V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a>\xF4Wa>\xF4aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10a?\x19Wa?\x19aU!V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10a?=Wa?=aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10a?bWa?baU!V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10a?\x86Wa?\x86aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10a?\xABWa?\xABaU!V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10a?\xCFWa?\xCFaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10a?\xF4Wa?\xF4aU!V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10a@\x18Wa@\x18aU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10a@=Wa@=aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10a@aWa@aaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10a@\x86Wa@\x86aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10a@\xAAWa@\xAAaU!V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10a@\xD3Wa@\xD3aU!V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10a@\xF7Wa@\xF7aU!V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` aYy\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aATW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aA#V[PP\x93\x92PPPV[aAeaO0V[aAmaOJV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aA\x9FW`\0\x80\xFD[P\x80aA\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\x08[V[PP\x92\x91PPV[aA\xF9aO0V[aB\x01aOhV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aB>W`\0\x80\xFD[P\x80aA\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[\x80Q\x15aB\x9CW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aB\xC3\x81`\x1FaU\x87V[\x10\x15aC\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\x08[V[aC\x0C\x82\x84aU\x87V[\x84Q\x10\x15aCPW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\x08[V[``\x82\x15\x80\x15aCoW`@Q\x91P`\0\x82R` \x82\x01`@RaC\xB9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aC\xA8W\x80Q\x83R` \x92\x83\x01\x92\x01aC\x90V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` aYy\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aDaW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aD\x8FW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aYy\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aD\xBDWaD\xBDaO\xCCV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aD\xE6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a:\xE4W` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aE\"W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaE\x06V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aYy\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aZ\x19\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xB9\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xF9\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY9\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aF\\WaF\\aU!V[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aF{WaF{aU!V[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aG]WaG]aU!V[` \x90\x81\x02\x91\x90\x91\x01\x01RaGr\x85\x82aU\x0EV[\x87`\x01\x81Q\x81\x10aG\x85WaG\x85aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aG\xAAWaG\xAAaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aG\xCFWaG\xCFaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aG\xF4WaG\xF4aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aH\x19WaH\x19aU!V[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aH=WaH=aU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aHaWaHaaU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aH\x85WaH\x85aU!V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aH\xA9WaH\xA9aU!V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aH\xD8WaH\xD8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aH\xFDWaH\xFDaU!V[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aI,WaI,aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aIQWaIQaU!V[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aI\x8AWaI\x8AaU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aI\xAFWaI\xAFaU!V[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aI\xE8WaI\xE8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aJ\rWaJ\raU!V[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aJFWaJFaU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aJkWaJkaU!V[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aJ\xA4WaJ\xA4aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aJ\xC9WaJ\xC9aU!V[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aJ\xE5\x91\x90aU\x0EV[\x87`\x0C\x81Q\x81\x10aJ\xF8WaJ\xF8aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aK\x1DWaK\x1DaU!V[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aK=WaK=aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aKbWaKbaU!V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aK\xB2WaK\xB2aU!V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aK\xD7WaK\xD7aU!V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaK\xEE\x90\x82aU\x0EV[\x87`\x0F\x81Q\x81\x10aL\x01WaL\x01aU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aL%WaL%aU!V[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aLkWaLkaU!V[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aL\x8FWaL\x8FaU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aL\xBBWaL\xBBaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aL\xE0WaL\xE0aU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aM\x0CWaM\x0CaU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aM1WaM1aU!V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aM]WaM]aU!V[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aM\x82WaM\x82aU!V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aN\x14aO0V[\x81R` \x01aN!aO0V[\x81R` \x01aN.aO0V[\x81R` \x01aN;aO0V[\x81R` \x01aNHaO0V[\x81R` \x01aNUaO0V[\x81R` \x01aNbaO0V[\x81R` \x01aNoaO0V[\x81R` \x01aN|aO0V[\x81R` \x01aN\x89aO0V[\x81R` \x01aN\x96aO0V[\x81R` \x01aN\xA3aO0V[\x81R` \x01aN\xB0aO0V[\x81R` \x01aN\xBDaO0V[\x81R` \x01aN\xCAaO0V[\x81R` \x01aN\xD7aO0V[\x81R` \x01aN\xE4aO0V[\x81R` \x01aN\xF1aO0V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aN\xE4[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aO\xAFW`\0\x80\xFD[a \xAB\x82aO\x86V[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\x05WaP\x05aO\xCCV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP3WaP3aO\xCCV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aPfW`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aP\x88WaP\x88aO\xCCV[\x81`@R\x80\x92PaP\x98\x84aP;V[\x81RaP\xA6` \x85\x01aP;V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aQ\x01W`\0\x80\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aQ#WaQ#aO\xCCV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aQRW`\0\x80\xFD[aQ\\\x85\x85aPRV[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aQuW`\0\x80\xFD[aQ}aO\xE2V[\x92PaQ\x8B\x87\x83\x88\x01aP\xEFV[\x83Ra\x01@aQ\x9C\x88\x82\x89\x01aP\xEFV[` \x85\x01Ra\x01\x80aQ\xB0\x89\x82\x8A\x01aP\xEFV[`@\x86\x01Ra\x01\xC0aQ\xC4\x8A\x82\x8B\x01aP\xEFV[``\x87\x01Ra\x02\0aQ\xD8\x8B\x82\x8C\x01aP\xEFV[`\x80\x88\x01Ra\x02@aQ\xEC\x8C\x82\x8D\x01aP\xEFV[`\xA0\x89\x01Ra\x02\x80aR\0\x8D\x82\x8E\x01aP\xEFV[`\xC0\x8A\x01Ra\x02\xC0aR\x14\x8E\x82\x8F\x01aP\xEFV[`\xE0\x8B\x01RaR'\x8Ea\x03\0\x8F\x01aP\xEFV[\x89\x8B\x01RaR9\x8Ea\x03@\x8F\x01aP\xEFV[a\x01 \x8B\x01RaRM\x8Ea\x03\x80\x8F\x01aP\xEFV[\x87\x8B\x01RaR_\x8Ea\x03\xC0\x8F\x01aP\xEFV[a\x01`\x8B\x01RaRs\x8Ea\x04\0\x8F\x01aP\xEFV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aS\nW`\0\x80\xFD[aS\x13\x83aO\x86V[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aS0W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aSDW`\0\x80\xFD[\x815\x81\x81\x11\x15aSVWaSVaO\xCCV[aSh`\x1F\x82\x01`\x1F\x19\x16\x85\x01aP\x0BV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aS~W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\xD6W`\0\x80\xFD[a \xAB\x82aS\xB0V[`\0` \x82\x84\x03\x12\x15aS\xF1W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aT\x0EW`\0\x80\xFD[aT\x18\x85\x85aPRV[\x92PaT'a\x01\0\x85\x01aS\xB0V[\x91PaT6a\x01 \x85\x01aO\x86V[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aTRW`\0\x80\xFD[a \xAB\x83\x83aPRV[`\0[\x83\x81\x10\x15aTwW\x81\x81\x01Q\x83\x82\x01R` \x01aT_V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaT\x9F\x81`@\x85\x01` \x87\x01aT\\V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aT\xC6W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aA\xE9WaA\xE9aT\xD5V[\x81\x81\x03\x81\x81\x11\x15a\x10\x1AWa\x10\x1AaT\xD5V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81aUFWaUFaT\xD5V[P`\0\x19\x01\x90V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a2\x15Wa2\x15aT\xD5V[`\0` \x82\x84\x03\x12\x15aU\x80W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x10\x1AWa\x10\x1AaT\xD5V[`\0\x82QaU\xAC\x81\x84` \x87\x01aT\\V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aU\xC9\x82\x85\x83\x8D\x01aT\\V[\x88Q\x91\x84\x01\x91aU\xDC\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aU\xEE\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aV\0\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aV\x12\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aV$\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaVG\x81\x84` \x88\x01aT\\V[\x83Q\x90\x83\x01\x90aV[\x81\x83` \x88\x01aT\\V[\x01\x94\x93PPPPV[`\0\x87QaVv\x81\x84` \x8C\x01aT\\V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84QaV\xB2\x81\x84` \x89\x01aT\\V[\x84Q\x90\x83\x01\x90aV\xC6\x81\x83` \x89\x01aT\\V[\x84Q\x91\x01\x90aV\xD9\x81\x83` \x88\x01aT\\V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82aW\x16WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85QaW-\x81\x84` \x8A\x01aT\\V[\x85Q\x90\x83\x01\x90aWA\x81\x83` \x8A\x01aT\\V[\x85Q\x91\x01\x90aWT\x81\x83` \x89\x01aT\\V[\x84Q\x91\x01\x90aWg\x81\x83` \x88\x01aT\\V[\x01\x96\x95PPPPPPV[`\0\x89Q` aW\x85\x82\x85\x83\x8F\x01aT\\V[\x8AQ\x91\x84\x01\x91aW\x98\x81\x84\x84\x8F\x01aT\\V[\x8AQ\x92\x01\x91aW\xAA\x81\x84\x84\x8E\x01aT\\V[\x89Q\x92\x01\x91aW\xBC\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aW\xCE\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aW\xE0\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aW\xF2\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aX\x04\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` aX*\x82\x85\x83\x8E\x01aT\\V[\x89Q\x91\x84\x01\x91aX=\x81\x84\x84\x8E\x01aT\\V[\x89Q\x92\x01\x91aXO\x81\x84\x84\x8D\x01aT\\V[\x88Q\x92\x01\x91aXa\x81\x84\x84\x8C\x01aT\\V[\x87Q\x92\x01\x91aXs\x81\x84\x84\x8B\x01aT\\V[\x86Q\x92\x01\x91aX\x85\x81\x84\x84\x8A\x01aT\\V[\x85Q\x92\x01\x91aX\x97\x81\x84\x84\x89\x01aT\\V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQaX\xBB\x81\x84` \x8F\x01aT\\V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([84, 100, 96, 133], ())
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getHotShotCommitment` (0x8584d23f) function
+ pub fn get_hot_shot_commitment(
+ &self,
+ hot_shot_block_height: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([133, 132, 210, 63], hot_shot_block_height)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getStateUpdateBlockNumbersCount` (0x7053fc51) function
+ pub fn get_state_update_block_numbers_count(
+ &self,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([112, 83, 252, 81], ())
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `getVersion` (0x0d8e6e2c) function
pub fn get_version(&self) -> ::ethers::contract::builders::ContractCall {
self.0
.method_hash([13, 142, 110, 44], ())
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `hotShotCommitments` (0xdb13b60a) function
+ pub fn hot_shot_commitments(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall
+ {
+ self.0
+ .method_hash([219, 19, 182, 10], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `initialize` (0xa244d596) function
pub fn initialize(
&self,
@@ -1092,6 +1286,16 @@ pub mod light_client {
.method_hash([162, 68, 213, 150], (genesis, num_blocks_per_epoch, owner))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function
+ pub fn lag_over_escape_hatch_threshold(
+ &self,
+ block_number: ::ethers::core::types::U256,
+ threshold: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([224, 48, 51, 1], (block_number, threshold))
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `newFinalizedState` (0x409939b7) function
pub fn new_finalized_state(
&self,
@@ -1147,6 +1351,15 @@ pub mod light_client {
.method_hash([1, 63, 165, 252], prover)
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `stateUpdateBlockNumbers` (0xa51e6fea) function
+ pub fn state_update_block_numbers(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([165, 30, 111, 234], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `states` (0x7f17baad) function
pub fn states(
&self,
@@ -1343,6 +1556,24 @@ pub mod light_client {
)]
#[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")]
pub struct FailedInnerCall;
+ ///Custom Error type `InsufficientSnapshotHistory` with signature `InsufficientSnapshotHistory()` and selector `0xb0b43877`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InsufficientSnapshotHistory",
+ abi = "InsufficientSnapshotHistory()"
+ )]
+ pub struct InsufficientSnapshotHistory;
///Custom Error type `InvalidAddress` with signature `InvalidAddress()` and selector `0xe6c4247b`
#[derive(
Clone,
@@ -1373,6 +1604,24 @@ pub mod light_client {
)]
#[etherror(name = "InvalidArgs", abi = "InvalidArgs()")]
pub struct InvalidArgs;
+ ///Custom Error type `InvalidHotShotBlockForCommitmentCheck` with signature `InvalidHotShotBlockForCommitmentCheck()` and selector `0x615a9264`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InvalidHotShotBlockForCommitmentCheck",
+ abi = "InvalidHotShotBlockForCommitmentCheck()"
+ )]
+ pub struct InvalidHotShotBlockForCommitmentCheck;
///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9`
#[derive(
Clone,
@@ -1649,8 +1898,10 @@ pub mod light_client {
ERC1967InvalidImplementation(ERC1967InvalidImplementation),
ERC1967NonPayable(ERC1967NonPayable),
FailedInnerCall(FailedInnerCall),
+ InsufficientSnapshotHistory(InsufficientSnapshotHistory),
InvalidAddress(InvalidAddress),
InvalidArgs(InvalidArgs),
+ InvalidHotShotBlockForCommitmentCheck(InvalidHotShotBlockForCommitmentCheck),
InvalidInitialization(InvalidInitialization),
InvalidPolyEvalArgs(InvalidPolyEvalArgs),
InvalidProof(InvalidProof),
@@ -1697,12 +1948,24 @@ pub mod light_client {
if let Ok(decoded) = ::decode(data) {
return Ok(Self::FailedInnerCall(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::InsufficientSnapshotHistory(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidAddress(decoded));
}
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidArgs(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::InvalidHotShotBlockForCommitmentCheck(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -1785,8 +2048,14 @@ pub mod light_client {
}
Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InsufficientSnapshotHistory(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidAddress(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::InvalidArgs(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidInitialization(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
@@ -1847,12 +2116,20 @@ pub mod light_client {
== ::selector() => {
true
}
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
}
_ if selector
== ::selector() => true,
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
@@ -1926,8 +2203,12 @@ pub mod light_client {
}
Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f),
Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InsufficientSnapshotHistory(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidAddress(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidArgs(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidPolyEvalArgs(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f),
@@ -1977,6 +2258,11 @@ pub mod light_client {
Self::FailedInnerCall(value)
}
}
+ impl ::core::convert::From for LightClientErrors {
+ fn from(value: InsufficientSnapshotHistory) -> Self {
+ Self::InsufficientSnapshotHistory(value)
+ }
+ }
impl ::core::convert::From for LightClientErrors {
fn from(value: InvalidAddress) -> Self {
Self::InvalidAddress(value)
@@ -1987,6 +2273,11 @@ pub mod light_client {
Self::InvalidArgs(value)
}
}
+ impl ::core::convert::From for LightClientErrors {
+ fn from(value: InvalidHotShotBlockForCommitmentCheck) -> Self {
+ Self::InvalidHotShotBlockForCommitmentCheck(value)
+ }
+ }
impl ::core::convert::From for LightClientErrors {
fn from(value: InvalidInitialization) -> Self {
Self::InvalidInitialization(value)
@@ -2469,6 +2760,59 @@ pub mod light_client {
)]
#[ethcall(name = "getGenesisState", abi = "getGenesisState()")]
pub struct GetGenesisStateCall;
+ ///Container type for all input parameters for the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getHotShotBlockCommitmentsCount",
+ abi = "getHotShotBlockCommitmentsCount()"
+ )]
+ pub struct GetHotShotBlockCommitmentsCountCall;
+ ///Container type for all input parameters for the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "getHotShotCommitment", abi = "getHotShotCommitment(uint256)")]
+ pub struct GetHotShotCommitmentCall {
+ pub hot_shot_block_height: ::ethers::core::types::U256,
+ }
+ ///Container type for all input parameters for the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getStateUpdateBlockNumbersCount",
+ abi = "getStateUpdateBlockNumbersCount()"
+ )]
+ pub struct GetStateUpdateBlockNumbersCountCall;
///Container type for all input parameters for the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -2484,6 +2828,21 @@ pub mod light_client {
)]
#[ethcall(name = "getVersion", abi = "getVersion()")]
pub struct GetVersionCall;
+ ///Container type for all input parameters for the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "hotShotCommitments", abi = "hotShotCommitments(uint256)")]
+ pub struct HotShotCommitmentsCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)` and selector `0xa244d596`
#[derive(
Clone,
@@ -2506,6 +2865,27 @@ pub mod light_client {
pub num_blocks_per_epoch: u32,
pub owner: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "lagOverEscapeHatchThreshold",
+ abi = "lagOverEscapeHatchThreshold(uint256,uint256)"
+ )]
+ pub struct LagOverEscapeHatchThresholdCall {
+ pub block_number: ::ethers::core::types::U256,
+ pub threshold: ::ethers::core::types::U256,
+ }
///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x409939b7`
#[derive(
Clone,
@@ -2617,6 +2997,24 @@ pub mod light_client {
pub struct SetPermissionedProverCall {
pub prover: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "stateUpdateBlockNumbers",
+ abi = "stateUpdateBlockNumbers(uint256)"
+ )]
+ pub struct StateUpdateBlockNumbersCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
@@ -2714,8 +3112,13 @@ pub mod light_client {
FrozenThreshold(FrozenThresholdCall),
GetFinalizedState(GetFinalizedStateCall),
GetGenesisState(GetGenesisStateCall),
+ GetHotShotBlockCommitmentsCount(GetHotShotBlockCommitmentsCountCall),
+ GetHotShotCommitment(GetHotShotCommitmentCall),
+ GetStateUpdateBlockNumbersCount(GetStateUpdateBlockNumbersCountCall),
GetVersion(GetVersionCall),
+ HotShotCommitments(HotShotCommitmentsCall),
Initialize(InitializeCall),
+ LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall),
NewFinalizedState(NewFinalizedStateCall),
Owner(OwnerCall),
PermissionedProver(PermissionedProverCall),
@@ -2723,6 +3126,7 @@ pub mod light_client {
ProxiableUUID(ProxiableUUIDCall),
RenounceOwnership(RenounceOwnershipCall),
SetPermissionedProver(SetPermissionedProverCall),
+ StateUpdateBlockNumbers(StateUpdateBlockNumbersCall),
States(StatesCall),
TransferOwnership(TransferOwnershipCall),
UpgradeToAndCall(UpgradeToAndCallCall),
@@ -2778,12 +3182,41 @@ pub mod light_client {
{
return Ok(Self::GetGenesisState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetHotShotBlockCommitmentsCount(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::GetHotShotCommitment(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetStateUpdateBlockNumbersCount(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::GetVersion(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::HotShotCommitments(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::Initialize(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::LagOverEscapeHatchThreshold(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -2816,6 +3249,11 @@ pub mod light_client {
{
return Ok(Self::SetPermissionedProver(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::StateUpdateBlockNumbers(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::States(decoded));
}
@@ -2862,8 +3300,23 @@ pub mod light_client {
Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetHotShotCommitment(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::HotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::LagOverEscapeHatchThreshold(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::NewFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::PermissionedProver(element) => {
@@ -2877,6 +3330,9 @@ pub mod light_client {
Self::SetPermissionedProver(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
+ Self::StateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::States(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
@@ -2901,8 +3357,17 @@ pub mod light_client {
Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
+ Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f),
+ Self::HotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
Self::Initialize(element) => ::core::fmt::Display::fmt(element, f),
+ Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::Owner(element) => ::core::fmt::Display::fmt(element, f),
Self::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
@@ -2910,6 +3375,7 @@ pub mod light_client {
Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f),
Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::SetPermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
+ Self::StateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
Self::States(element) => ::core::fmt::Display::fmt(element, f),
Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f),
@@ -2963,16 +3429,41 @@ pub mod light_client {
Self::GetGenesisState(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetHotShotBlockCommitmentsCountCall) -> Self {
+ Self::GetHotShotBlockCommitmentsCount(value)
+ }
+ }
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetHotShotCommitmentCall) -> Self {
+ Self::GetHotShotCommitment(value)
+ }
+ }
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetStateUpdateBlockNumbersCountCall) -> Self {
+ Self::GetStateUpdateBlockNumbersCount(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: GetVersionCall) -> Self {
Self::GetVersion(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: HotShotCommitmentsCall) -> Self {
+ Self::HotShotCommitments(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: InitializeCall) -> Self {
Self::Initialize(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: LagOverEscapeHatchThresholdCall) -> Self {
+ Self::LagOverEscapeHatchThreshold(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: NewFinalizedStateCall) -> Self {
Self::NewFinalizedState(value)
@@ -3008,6 +3499,11 @@ pub mod light_client {
Self::SetPermissionedProver(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: StateUpdateBlockNumbersCall) -> Self {
+ Self::StateUpdateBlockNumbers(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: StatesCall) -> Self {
Self::States(value)
@@ -3145,6 +3641,48 @@ pub mod light_client {
Hash,
)]
pub struct GetGenesisStateReturn(pub LightClientState);
+ ///Container type for all return fields from the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotBlockCommitmentsCountReturn(pub ::ethers::core::types::U256);
+ ///Container type for all return fields from the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotCommitmentReturn(pub HotShotCommitment);
+ ///Container type for all return fields from the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetStateUpdateBlockNumbersCountReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -3163,6 +3701,37 @@ pub mod light_client {
pub minor_version: u8,
pub patch_version: u8,
}
+ ///Container type for all return fields from the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct HotShotCommitmentsReturn {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+ }
+ ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct LagOverEscapeHatchThresholdReturn(pub bool);
///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b`
#[derive(
Clone,
@@ -3219,6 +3788,20 @@ pub mod light_client {
Hash,
)]
pub struct ProxiableUUIDReturn(pub [u8; 32]);
+ ///Container type for all return fields from the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct StateUpdateBlockNumbersReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs
index c8acbe2fa..d198c1973 100644
--- a/contract-bindings/src/light_client_mock.rs
+++ b/contract-bindings/src/light_client_mock.rs
@@ -219,6 +219,65 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotCommitment"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotCommitment",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment",
+ ),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("getVersion"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -251,6 +310,37 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockHeight"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint64"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockCommRoot"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("BN254.ScalarField"),
+ ),
+ },
+ ],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("initialize"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -294,6 +384,37 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold",),
+ inputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockNumber"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("threshold"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Bool,
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("bool"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("newFinalizedState"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -512,6 +633,31 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("setHotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setHotShotCommitments",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("values"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Array(
+ ::std::boxed::Box::new(
+ ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ ),
+ ),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment[]",
+ ),
+ ),
+ },],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("setPermissionedProver"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -528,6 +674,48 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("setStateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setStateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("values"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Array(
+ ::std::boxed::Box::new(
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ),
+ ),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256[]"),
+ ),
+ },],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("states"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -829,6 +1017,13 @@ pub mod light_client_mock {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory",),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidAddress"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -843,6 +1038,15 @@ pub mod light_client_mock {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InvalidHotShotBlockForCommitmentCheck"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned(
+ "InvalidHotShotBlockForCommitmentCheck",
+ ),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidInitialization"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -988,12 +1192,12 @@ pub mod light_client_mock {
pub static LIGHTCLIENTMOCK_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[P`@Qb\0c\xCA8\x03\x80b\0c\xCA\x839\x81\x01`@\x81\x90Rb\0\08\x91b\0\x04\x1BV[b\0\0Bb\0\0VV[b\0\0N\x82\x82b\0\x01\nV[PPb\0\x04\xEEV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x07W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x01/WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01=WP`\x80\x82\x01Q\x15[\x80b\0\x01KWP`\xA0\x82\x01Q\x15[\x80b\0\x01YWP`\xC0\x82\x01Q\x15[\x80b\0\x01gWP`\xE0\x82\x01Q\x15[\x80b\0\x01wWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15b\0\x01\x96W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0b\0\x03\x84\x83b\0\x03\xA1` \x1B` \x1CV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[`\0\x80\x82\x84\x03a\x01 \x81\x12\x15b\0\x041W`\0\x80\xFD[a\x01\0\x80\x82\x12\x15b\0\x04BW`\0\x80\xFD[`@Q\x91P\x80\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17\x15b\0\x04tWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Rb\0\x04\x82\x85b\0\x03\xE9V[\x82Rb\0\x04\x92` \x86\x01b\0\x03\xE9V[` \x83\x01R`@\x85\x01Q`@\x83\x01R``\x85\x01Q``\x83\x01R`\x80\x85\x01Q`\x80\x83\x01R`\xA0\x85\x01Q`\xA0\x83\x01R`\xC0\x85\x01Q`\xC0\x83\x01R`\xE0\x85\x01Q`\xE0\x83\x01R\x81\x93Pb\0\x04\xE3\x81\x86\x01b\0\x04\x06V[\x92PPP\x92P\x92\x90PV[`\x80Qa^\xB2b\0\x05\x18`\09`\0\x81\x81a\x14\xD2\x01R\x81\x81a\x14\xFB\x01Ra\x16\xE9\x01Ra^\xB2`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\x96W`\x005`\xE0\x1C\x80cqP\x18\xA6\x11a\0\xE1W\x80c\xA2D\xD5\x96\x11a\0\x8AW\x80c\xBD2Q\x9A\x11a\0dW\x80c\xBD2Q\x9A\x14a\x06\xBFW\x80c\xCAo\xE8U\x14a\x07\x01W\x80c\xF0h T\x14a\x07\x17W\x80c\xF2\xFD\xE3\x8B\x14a\x07IW`\0\x80\xFD[\x80c\xA2D\xD5\x96\x14a\x05\xE6W\x80c\xAA\x92'2\x14a\x06\x06W\x80c\xAD<\xB1\xCC\x14a\x06iW`\0\x80\xFD[\x80c\x7F\x17\xBA\xAD\x11a\0\xBBW\x80c\x7F\x17\xBA\xAD\x14a\x04\xDFW\x80c\x82\xD0\x7F\xF3\x14a\x05\x94W\x80c\x8D\xA5\xCB[\x14a\x05\xA9W`\0\x80\xFD[\x80cqP\x18\xA6\x14a\x04jW\x80cvg\x18\x08\x14a\x04\x7FW\x80cv\xB6\xB7\xCB\x14a\x04\xC9W`\0\x80\xFD[\x80c@\x999\xB7\x11a\x01CW\x80cR\xD1\x90-\x11a\x01\x1DW\x80cR\xD1\x90-\x14a\x04*W\x80cb\x82w3\x14a\x04?W\x80ci\xCCj\x04\x14a\x04UW`\0\x80\xFD[\x80c@\x999\xB7\x14a\x03sW\x80cHG\xAE]\x14a\x03\x93W\x80cO\x1E\xF2\x86\x14a\x04\x17W`\0\x80\xFD[\x80c1=\xF7\xB1\x11a\x01tW\x80c1=\xF7\xB1\x14a\x02\xB1W\x80c8+!Z\x14a\x02\xE9W\x80c9I\xD1\xE9\x14a\x03\rW`\0\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\x9BW\x80c\r\x8En,\x14a\x01\xBDW\x80c *\n\xDB\x14a\x01\xEFW[`\0\x80\xFD[4\x80\x15a\x01\xA7W`\0\x80\xFD[Pa\x01\xBBa\x01\xB66`\x04aU\x83V[a\x07iV[\0[4\x80\x15a\x01\xC9W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xFBW`\0\x80\xFD[Pa\x01\xBBa\x02\n6`\x04aV\xC5V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x95\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[4\x80\x15a\x02\xBDW`\0\x80\xFD[P`\x06Ta\x02\xD1\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x02\xF5W`\0\x80\xFD[Pa\x02\xFF`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xE6V[4\x80\x15a\x03\x19W`\0\x80\xFD[Pa\x01\xBBa\x03(6`\x04aV\xE2V[`\0\x80Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03\x7FW`\0\x80\xFD[Pa\x01\xBBa\x03\x8E6`\x04aWLV[a\x08\x81V[4\x80\x15a\x03\x9FW`\0\x80\xFD[Pa\x03\xA8a\x0B\xB9V[`@Qa\x01\xE6\x91\x90`\0a\x01\0\x82\x01\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xBBa\x04%6`\x04aY$V[a\x0C\xA1V[4\x80\x15a\x046W`\0\x80\xFD[Pa\x02\xFFa\x0C\xC0V[4\x80\x15a\x04KW`\0\x80\xFD[Pa\x02\xFF`\x02T\x81V[4\x80\x15a\x04aW`\0\x80\xFD[Pa\x01\xBBa\x0C\xEFV[4\x80\x15a\x04vW`\0\x80\xFD[Pa\x01\xBBa\r\xA1V[4\x80\x15a\x04\x8BW`\0\x80\xFD[P`\0Ta\x04\xB0\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x04\xD5W`\0\x80\xFD[Pa\x02\xFF`\x01T\x81V[4\x80\x15a\x04\xEBW`\0\x80\xFD[Pa\x05Ma\x04\xFA6`\x04aY\xDEV[`\x05` \x81\x90R`\0\x91\x82R`@\x90\x91 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T\x95\x85\x01T`\x06\x90\x95\x01Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x97`\x01`@\x1B\x90\x96\x04\x16\x95\x93\x94\x92\x93\x91\x92\x91\x90\x88V[`@\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x99\x8A\x16\x81R\x98\x90\x97\x16` \x89\x01R\x95\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01a\x01\xE6V[4\x80\x15a\x05\xA0W`\0\x80\xFD[Pa\x03\xA8a\r\xB3V[4\x80\x15a\x05\xB5W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02\xD1V[4\x80\x15a\x05\xF2W`\0\x80\xFD[Pa\x01\xBBa\x06\x016`\x04aY\xF9V[a\x0E\x98V[4\x80\x15a\x06\x12W`\0\x80\xFD[Pa\x02\xFFa\x06!6`\x04aV\xC5V[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[4\x80\x15a\x06uW`\0\x80\xFD[Pa\x06\xB2`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01\xE6\x91\x90aZdV[4\x80\x15a\x06\xCBW`\0\x80\xFD[P`\x06Ta\x06\xF1\x90t\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x81V[`@Q\x90\x15\x15\x81R` \x01a\x01\xE6V[4\x80\x15a\x07\rW`\0\x80\xFD[Pa\x02\xFF`\x04T\x81V[4\x80\x15a\x07#W`\0\x80\xFD[P`\0Ta\x074\x90c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x07UW`\0\x80\xFD[Pa\x01\xBBa\x07d6`\x04aU\x83V[a\x10$V[a\x07qa\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x07\xB1W`@Q\x7F\xE6\xC4${\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x07\xF9W`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x83\x81\x16\x91\x90\x91\x17t\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x91\x82\x90U`@Q\x91\x16\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x80\x15a\x08\xB6WP`\x06T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\t/W`\x06T`\x01`\x01`\xA0\x1B\x03\x16a\x08\xFDW`@Q\x7F%\xCD\xA3\xCE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA3\xA6G\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t7a\r\xB3V[Q\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16\x91\x16\x11\x15\x80a\txWPa\tXa\r\xB3V[` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x11\x15[\x15a\t\xAFW`@Q\x7F\x05\x1CF\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80Ta\t\xDE\x90c\xFF\xFF\xFF\xFF\x81\x16\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16aZ\xADV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` R`@\x90\x91 T\x91\x92P\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x82\x16\x14\x80\x15\x81a\n7WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x11[\x15a\n\x7FW`@Q\x7F\x1B#5\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\n\x8C\x84`@\x01Qa\x10\xEFV[a\n\x99\x84``\x01Qa\x10\xEFV[a\n\xA6\x84`\x80\x01Qa\x10\xEFV[a\n\xB3\x84`\xA0\x01Qa\x10\xEFV[a\n\xC0\x84`\xC0\x01Qa\x10\xEFV[\x80\x15a\n\xCEWa\n\xCEa\x11_V[a\n\xD8\x84\x84a\x12\xBCV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x88Q\x81T\x8A\x84\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x96\x87\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x92\x16\x92\x16\x91\x82\x17\x17\x82U\x89\x86\x01Q`\x01\x83\x01\x81\x90U``\x8B\x01Q`\x02\x84\x01U`\x80\x8B\x01Q`\x03\x84\x01U`\xA0\x8B\x01Q`\x04\x84\x01U`\xC0\x8B\x01Q\x94\x83\x01\x94\x90\x94U`\xE0\x8A\x01Q`\x06\x90\x92\x01\x91\x90\x91U\x93Q\x91\x82R\x91\x92\x91\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x91\x01`@Q\x80\x91\x03\x90\xA3PPPPV[a\x0C\x15`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Td\x01\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05` \x81\x81R`@\x92\x83\x90 \x83Qa\x01\0\x81\x01\x85R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R`\x01`@\x1B\x90\x91\x04\x16\x92\x81\x01\x92\x90\x92R`\x01\x81\x01T\x93\x82\x01\x93\x90\x93R`\x02\x83\x01T``\x82\x01R`\x03\x83\x01T`\x80\x82\x01R`\x04\x83\x01T`\xA0\x82\x01R\x90\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[a\x0C\xA9a\x14\xC7V[a\x0C\xB2\x82a\x15\x97V[a\x0C\xBC\x82\x82a\x15\xD8V[PPV[`\0a\x0C\xCAa\x16\xDEV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0C\xF7a\x10{V[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\rmW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\r\xA9a\x10{V[a\r\x9F`\0a\x17@V[a\x0E\x0F`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x0E\xDEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x0E\xFBWP0;\x15[\x90P\x81\x15\x80\x15a\x0F\tWP\x80\x15[\x15a\x0F@W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0F\x86W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16`\x01`@\x1B\x17\x85U[a\x0F\x8F\x86a\x17\xC9V[a\x0F\x97a\x17\xDAV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16`\x01`@\x1B\x17\x90Ua\x0F\xCF\x88\x88a\x17\xE2V[\x83\x15a\x10\x1AW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x10,a\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10oW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\nvV[a\x10x\x81a\x17@V[PV[3a\x10\xAD\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\r\x9FW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\nvV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0C\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[`\0\x80T`\x01`@\x1B\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x12T\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aZ\xD1V[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x08vV[`\0a\x12\xC6a\x1A\xD2V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x13\x05Wa\x13\x05aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x133Wa\x133aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x13aWa\x13aaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x13\x85Wa\x13\x85aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x13\xA9Wa\x13\xA9aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x13\xEDWa\x13\xEDaZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x141Wa\x141aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x14tWa\x14taZ\xF2V[` \x02` \x01\x01\x81\x81RPPa\x14\x8B\x82\x82\x85a \xB3V[a\x14\xC1W`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x15`WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x15T\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\x9Fa\x10{V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08vV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x162WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x16/\x91\x81\x01\x90a[\x08V[`\x01[a\x16sW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x16\xCFW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\nvV[a\x16\xD9\x83\x83a!\x9EV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x17\xD1a!\xF4V[a\x10x\x81a\"VV[a\r\x9Fa!\xF4V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x18\x08WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x18\x15WP`\x80\x82\x01Q\x15[\x80a\x18\"WP`\xA0\x82\x01Q\x15[\x80a\x18/WP`\xC0\x82\x01Q\x15[\x80a\x18!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a \xBE\x82a\"^V[a \xE1\x83`\0\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[` \x02` \x01\x01Qa\x10\xEFV[a \xF7\x83`\x01\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!\r\x83`\x02\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!#\x83`\x03\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!9\x83`\x04\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!O\x83`\x05\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!e\x83`\x06\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!{\x83`\x07\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[`\0a!\x88\x85\x85\x85a#\x96V[\x90Pa!\x93\x81a%\x17V[\x91PP[\x93\x92PPPV[a!\xA7\x82a)\xDFV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\xECWa\x16\xD9\x82\x82a*\x87V[a\x0C\xBCa*\xFFV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\r\x9FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10,a!\xF4V[\x80Qa\"i\x90a+7V[a\"v\x81` \x01Qa+7V[a\"\x83\x81`@\x01Qa+7V[a\"\x90\x81``\x01Qa+7V[a\"\x9D\x81`\x80\x01Qa+7V[a\"\xAA\x81`\xA0\x01Qa+7V[a\"\xB7\x81`\xC0\x01Qa+7V[a\"\xC4\x81`\xE0\x01Qa+7V[a\"\xD2\x81a\x01\0\x01Qa+7V[a\"\xE0\x81a\x01 \x01Qa+7V[a\"\xEE\x81a\x01@\x01Qa+7V[a\"\xFC\x81a\x01`\x01Qa+7V[a#\n\x81a\x01\x80\x01Qa+7V[a#\x18\x81a\x01\xA0\x01Qa\x10\xEFV[a#&\x81a\x01\xC0\x01Qa\x10\xEFV[a#4\x81a\x01\xE0\x01Qa\x10\xEFV[a#B\x81a\x02\0\x01Qa\x10\xEFV[a#P\x81a\x02 \x01Qa\x10\xEFV[a#^\x81a\x02@\x01Qa\x10\xEFV[a#l\x81a\x02`\x01Qa\x10\xEFV[a#z\x81a\x02\x80\x01Qa\x10\xEFV[a#\x88\x81a\x02\xA0\x01Qa\x10\xEFV[a\x10x\x81a\x02\xC0\x01Qa\x10\xEFV[a#\x9EaT\xDDV[\x83` \x01Q\x83Q\x14a#\xDCW`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\xE9\x85\x85\x85a+\xE1V[\x90P`\0a#\xFA\x86`\0\x01Qa/\x12V[\x90P`\0a$\r\x82\x84`\xA0\x01Q\x88a2\xF6V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$PW\x90PP\x90P`\0a$\x89\x8A\x85\x8A\x89\x87\x87a3VV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a%\xE0Wa%\xE0aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\x04Wa&\x04aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&'Wa&'aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&KWa&KaZ\xF2V[` \x02` \x01\x01\x81\x90RPa&`\x82\x84a3\x8BV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\x7F\x82`\x02a[!V[a&\x8A\x90`\x01a[!V[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xA5Wa&\xA5aU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&\xCEW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xEAWa&\xEAaU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'/W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\x08W\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a'\xD3W\x89`\x80\x01Q\x81\x81Q\x81\x10a']Wa']aZ\xF2V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'wWa'waZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\x99Wa'\x99aZ\xF2V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a'\xB3Wa'\xB3aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\xC9`\x01\x83a[!V[\x91P`\x01\x01a':V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a'\xEBWa'\xEBaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\x0EWa(\x0EaZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra($`\x01\x82a[!V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a(JWa(JaZ\xF2V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a(pWa(paZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x86`\x01\x82a[!V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa(\x9E\x82a4\x85V[\x84\x82\x81Q\x81\x10a(\xB0Wa(\xB0aZ\xF2V[` \x02` \x01\x01\x81\x81RPPa(\xE8`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a(\xFAWa(\xFAaZ\xF2V[` \x02` \x01\x01\x81\x90RPa)\x17a)\x12\x84\x86a3\x8BV[a4\xDBV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa)\xD5\x83\x82\x84a)\xD0a5zV[a6KV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*.W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa*\xA4\x91\x90a[4V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a*\xDFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a*\xE4V[``\x91P[P\x91P\x91Pa*\xF4\x85\x83\x83a7/V[\x92PPP[\x92\x91PPV[4\x15a\r\x9FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a+qWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x16\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[a,)`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a,j\x82\x87\x87a7\xA4V[\x81Q\x84Qa,w\x90a;\x85V[a,\x84\x86` \x01Qa;\x85V[a,\x91\x87`@\x01Qa;\x85V[a,\x9E\x88``\x01Qa;\x85V[a,\xAB\x89`\x80\x01Qa;\x85V[`@Q` \x01a,\xC0\x96\x95\x94\x93\x92\x91\x90a[PV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xDB\x82a\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3\x1A`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3$\x84\x84a>\x08V[\x80\x82Ra34\x90\x85\x90\x85\x90a>nV[` \x82\x01R\x80Qa3J\x90\x85\x90\x84\x90\x86\x90a>\xF4V[`@\x82\x01R\x93\x92PPPV[`\0\x80a3d\x85\x87\x89a@\xBBV[\x90Pa3t\x88\x86\x89\x89\x88\x88aA\xB9V[a3\x7F\x81\x87\x86aD\xD7V[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a3\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\nvV[a4.\x83`\0\x81Q\x81\x10a4\x06Wa4\x06aZ\xF2V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4!Wa4!aZ\xF2V[` \x02` \x01\x01QaE9V[\x90P`\x01[\x82Q\x81\x10\x15a4~Wa4t\x82a4o\x86\x84\x81Q\x81\x10a4UWa4UaZ\xF2V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4!Wa4!aZ\xF2V[aE\xDDV[\x91P`\x01\x01a43V[P\x92\x91PPV[`\0a4\xB1\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a\\\x93V[a*\xF9\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\\\xB5V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a5\x03WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa5H\x91\x90a\\\x93V[a5r\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\\\xB5V[\x90R\x92\x91PPV[a5\xA5`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7!W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\nvV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a7DWa7?\x82aF\x84V[a!\x97V[\x81Q\x15\x80\x15a7[WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7\x9DW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\nvV[P\x80a!\x97V[\x82Q`\xFE\x90a7\xDFa7\xB5\x83a<\xBCV[`@Q` \x01a7\xC7\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aF\xC6V[a8\x19a7\xEF\x86`\0\x01Qa<\xBCV[`@Q` \x01a8\x01\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aF\xC6V[a8)a7\xEF\x87` \x01Qa<\xBCV[`@Q` \x01a8<\x94\x93\x92\x91\x90a\\\xC8V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra8Y`\x01a<\xBCV[a8\x82\x7F/\x8D\xD1\xF1\xA7X^W\x84\x93P`\0[\x82\x81\x10\x15a>RW\x83\x85\x86\t\x94P`\x01\x01a>eV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a>\x80WP`\x01a!\x97V[\x81`\0\x03a>\x90WP`\0a!\x97V[`@\x84\x01Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a>\xD2W`\x01\x87\x03\x92Pa>\xD9V[`\x01\x84\x03\x92P[Pa>\xE3\x82aG\xEEV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90\x83\x83\x03a?\x87W`\x01`\0[\x82\x81\x10\x15a?zW\x81\x87\x03a?[W\x87\x81\x81Q\x81\x10a?HWa?HaZ\xF2V[` \x02` \x01\x01Q\x94PPPPPa7'V[\x83\x80a?iWa?ia\\}V[\x89``\x01Q\x83\t\x91P`\x01\x01a?'V[P`\0\x93PPPPa7'V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a?\xA1\x8D\x88aH\xA6V[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xBEWa?\xBEaU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a?\xE7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a@,W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a?\xF7V[Pa@6\x83aG\xEEV[\x92P`\0[\x88\x81\x10\x15a@\xA9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a@\x88W\x80\x82\x14a@\x80W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a@^V[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a@;V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[aA\xC7\x86\x86\x86\x86\x85\x87aI\x97V[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aB\x08WaB\x08aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aB,WaB,aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aBQWaBQaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aBuWaBuaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aB\x9AWaB\x9AaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aB\xBEWaB\xBEaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aB\xE3WaB\xE3aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aC\x07WaC\x07aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aC,WaC,aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aCPWaCPaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aCuWaCuaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aC\x99WaC\x99aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aC\xBEWaC\xBEaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aC\xE2WaC\xE2aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aD\x07WaD\x07aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aD+WaD+aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aDPWaDPaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aDtWaDtaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aD\x9DWaD\x9DaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aD\xC1WaD\xC1aZ\xF2V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aE0W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\xFFV[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaEUaU0V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aE\x87W`\0\x80\xFD[P\x80aE\xD5W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\xF9aUNV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aF6W`\0\x80\xFD[P\x80aE\xD5W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\nvV[\x80Q\x15aF\x94W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aF\xD4\x81`\x1Fa[!V[\x10\x15aG\"W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[aG,\x82\x84a[!V[\x84Q\x10\x15aG|W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[``\x82\x15\x80\x15aG\x9BW`@Q\x91P`\0\x82R` \x82\x01`@RaG\xE5V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aG\xD4W\x80Q\x83R` \x92\x83\x01\x92\x01aG\xBCV[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aH\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aH\xE6W`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI'WaI'aU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aIPW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a>eW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aI\x8CW\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaIpV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x07W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x01/WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01=WP`\x80\x82\x01Q\x15[\x80b\0\x01KWP`\xA0\x82\x01Q\x15[\x80b\0\x01YWP`\xC0\x82\x01Q\x15[\x80b\0\x01gWP`\xE0\x82\x01Q\x15[\x80b\0\x01wWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15b\0\x01\x96W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0b\0\x03\x84\x83b\0\x04r` \x1B` \x1CV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC\x7F\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q\x7F\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q\x7F\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4\x90\x93\x01\x92\x90\x92UPPV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x04\xD2W`\0\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x04\xD2W`\0\x80\xFD[`\0\x80\x82\x84\x03a\x01 \x81\x12\x15b\0\x05\x02W`\0\x80\xFD[a\x01\0\x80\x82\x12\x15b\0\x05\x13W`\0\x80\xFD[`@Q\x91P\x80\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17\x15b\0\x05EWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Rb\0\x05S\x85b\0\x04\xBAV[\x82Rb\0\x05c` \x86\x01b\0\x04\xBAV[` \x83\x01R`@\x85\x01Q`@\x83\x01R``\x85\x01Q``\x83\x01R`\x80\x85\x01Q`\x80\x83\x01R`\xA0\x85\x01Q`\xA0\x83\x01R`\xC0\x85\x01Q`\xC0\x83\x01R`\xE0\x85\x01Q`\xE0\x83\x01R\x81\x93Pb\0\x05\xB4\x81\x86\x01b\0\x04\xD7V[\x92PPP\x92P\x92\x90PV[`\x80Qa^\x88b\0\x05\xE9`\09`\0\x81\x81a\x16)\x01R\x81\x81a\x16R\x01Ra\x17\xBE\x01Ra^\x88`\0\xF3\xFE`\x80`@R`\x046\x10a\x01~W`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01\x83W\x80c\r\x8En,\x14a\x01\xA5W\x80c *\n\xDB\x14a\x01\xD7W\x80c1=\xF7\xB1\x14a\x02\x80W\x80c8+!Z\x14a\x02\xADW\x80c9\x194\x0F\x14a\x02\xD1W\x80c9I\xD1\xE9\x14a\x02\xF1W\x80c@\x999\xB7\x14a\x038W\x80cHG\xAE]\x14a\x03XW\x80cO\x1E\xF2\x86\x14a\x03\xDAW\x80cR\xD1\x90-\x14a\x03\xEDW\x80cS\x0C\xA7\x8F\x14a\x04\x02W\x80cTd`\x85\x14a\x04\"W\x80cb\x82w3\x14a\x047W\x80ci\xCCj\x04\x14a\x04MW\x80cpS\xFCQ\x14a\x04bW\x80cqP\x18\xA6\x14a\x04wW\x80cvg\x18\x08\x14a\x04\x8CW\x80cv\xB6\xB7\xCB\x14a\x04\xC0W\x80c\x7F\x17\xBA\xAD\x14a\x04\xD6W\x80c\x82\xD0\x7F\xF3\x14a\x05\x89W\x80c\x85\x84\xD2?\x14a\x05\x9EW\x80c\x8D\xA5\xCB[\x14a\x05\xE2W\x80c\xA2D\xD5\x96\x14a\x05\xF7W\x80c\xA5\x1Eo\xEA\x14a\x06\x17W\x80c\xAA\x92'2\x14a\x067W\x80c\xAD<\xB1\xCC\x14a\x06WW\x80c\xBD2Q\x9A\x14a\x06\x95W\x80c\xCAo\xE8U\x14a\x06\xC6W\x80c\xDB\x13\xB6\n\x14a\x06\xDCW\x80c\xE003\x01\x14a\x07\x1BW\x80c\xF0h T\x14a\x07;W\x80c\xF2\xFD\xE3\x8B\x14a\x07mW[`\0\x80\xFD[4\x80\x15a\x01\x8FW`\0\x80\xFD[Pa\x01\xA3a\x01\x9E6`\x04aRXV[a\x07\x8DV[\0[4\x80\x15a\x01\xB1W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xE3W`\0\x80\xFD[Pa\x01\xA3a\x01\xF26`\x04aS\xB8V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x90\x95\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[4\x80\x15a\x02\x8CW`\0\x80\xFD[P`\x06Ta\x02\xA0\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xCE\x91\x90aS\xD5V[4\x80\x15a\x02\xB9W`\0\x80\xFD[Pa\x02\xC3`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xCEV[4\x80\x15a\x02\xDDW`\0\x80\xFD[Pa\x01\xA3a\x02\xEC6`\x04aT\x0CV[a\x08MV[4\x80\x15a\x02\xFDW`\0\x80\xFD[Pa\x01\xA3a\x03\x0C6`\x04aT\xA1V[`\0\x80T`\x01`\x01`@\x1B\x03\x90\x92\x16`\x01``\x1B\x02`\x01``\x1B`\x01`\xA0\x1B\x03\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03DW`\0\x80\xFD[Pa\x01\xA3a\x03S6`\x04aT\xECV[a\x08pV[4\x80\x15a\x03dW`\0\x80\xFD[Pa\x03ma\x0B\x9BV[`@Qa\x01\xCE\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xA3a\x03\xE86`\x04aV\xA6V[a\x0C-V[4\x80\x15a\x03\xF9W`\0\x80\xFD[Pa\x02\xC3a\x0CHV[4\x80\x15a\x04\x0EW`\0\x80\xFD[Pa\x01\xA3a\x04\x1D6`\x04aWKV[a\x0CeV[4\x80\x15a\x04.W`\0\x80\xFD[P`\x08Ta\x02\xC3V[4\x80\x15a\x04CW`\0\x80\xFD[Pa\x02\xC3`\x02T\x81V[4\x80\x15a\x04YW`\0\x80\xFD[Pa\x01\xA3a\x0C\xE1V[4\x80\x15a\x04nW`\0\x80\xFD[P`\x07Ta\x02\xC3V[4\x80\x15a\x04\x83W`\0\x80\xFD[Pa\x01\xA3a\rQV[4\x80\x15a\x04\x98W`\0\x80\xFD[P`\0Ta\x04\xB3\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Qa\x01\xCE\x91\x90aW\xFCV[4\x80\x15a\x04\xCCW`\0\x80\xFD[Pa\x02\xC3`\x01T\x81V[4\x80\x15a\x04\xE2W`\0\x80\xFD[Pa\x05Ca\x04\xF16`\x04aX$V[`\x05` \x81\x90R`\0\x91\x82R`@\x90\x91 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T\x95\x85\x01T`\x06\x90\x95\x01T`\x01`\x01`@\x1B\x03\x80\x86\x16\x97`\x01`@\x1B\x90\x96\x04\x16\x95\x93\x94\x92\x93\x91\x92\x91\x90\x88V[`@\x80Q`\x01`\x01`@\x1B\x03\x99\x8A\x16\x81R\x98\x90\x97\x16` \x89\x01R\x95\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01a\x01\xCEV[4\x80\x15a\x05\x95W`\0\x80\xFD[Pa\x03ma\rcV[4\x80\x15a\x05\xAAW`\0\x80\xFD[Pa\x05\xBEa\x05\xB96`\x04aX?V[a\r\xF3V[`@\x80Q\x82Q`\x01`\x01`@\x1B\x03\x16\x81R` \x92\x83\x01Q\x92\x81\x01\x92\x90\x92R\x01a\x01\xCEV[4\x80\x15a\x05\xEEW`\0\x80\xFD[Pa\x02\xA0a\x0FMV[4\x80\x15a\x06\x03W`\0\x80\xFD[Pa\x01\xA3a\x06\x126`\x04aXXV[a\x0FhV[4\x80\x15a\x06#W`\0\x80\xFD[Pa\x02\xC3a\x0626`\x04aX?V[a\x10\x93V[4\x80\x15a\x06CW`\0\x80\xFD[Pa\x02\xC3a\x06R6`\x04aS\xB8V[a\x10\xB4V[4\x80\x15a\x06cW`\0\x80\xFD[Pa\x06\x88`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\xCE\x91\x90aX\xC3V[4\x80\x15a\x06\xA1W`\0\x80\xFD[P`\x06Ta\x06\xB6\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Q\x90\x15\x15\x81R` \x01a\x01\xCEV[4\x80\x15a\x06\xD2W`\0\x80\xFD[Pa\x02\xC3`\x04T\x81V[4\x80\x15a\x06\xE8W`\0\x80\xFD[Pa\x06\xFCa\x06\xF76`\x04aX?V[a\x10\xFCV[`@\x80Q`\x01`\x01`@\x1B\x03\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x01\xCEV[4\x80\x15a\x07'W`\0\x80\xFD[Pa\x06\xB6a\x0766`\x04aX\xF6V[a\x114V[4\x80\x15a\x07GW`\0\x80\xFD[P`\0Ta\x07X\x90c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xCEV[4\x80\x15a\x07yW`\0\x80\xFD[Pa\x01\xA3a\x07\x886`\x04aRXV[a\x12\x17V[a\x07\x95a\x12UV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x07\xBCW`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x07\xEBW`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x80T`\x01`\x01`\xA8\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x80\x84\x16\x91\x90\x91\x17`\x01`\xA0\x1B\x17\x91\x82\x90U`@Q\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x92a\x08B\x92\x16\x90aS\xD5V[`@Q\x80\x91\x03\x90\xA1PV[a\x08Y`\x07`\0aO\x91V[\x80Qa\x08l\x90`\x07\x90` \x84\x01\x90aO\xAFV[PPV[`\x06T`\x01`\xA0\x1B\x90\x04`\xFF\x16\x80\x15a\x08\x94WP`\x06T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x08\xDBW`\x06T`\x01`\x01`\xA0\x1B\x03\x16a\x08\xC2W`@Qc\x12\xE6\xD1\xE7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xE3a\rcV[Q\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\t!WPa\t\x03a\rcV[` \x01Q`\x01`\x01`@\x1B\x03\x16\x82` \x01Q`\x01`\x01`@\x1B\x03\x16\x11\x15[\x15a\t?W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80Ta\td\x90c\xFF\xFF\xFF\xFF\x81\x16\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16aY.V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` R`@\x90\x91 T\x91\x92P\x90\x04`\x01`\x01`@\x1B\x03\x90\x81\x16\x90\x82\x16\x14\x80\x15\x81a\t\xBAWP\x81`\x01`\x01`@\x1B\x03\x16\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x11[\x15a\t\xE3W\x81`@Qc\x03df\xBF`\xE3\x1B\x81R`\x04\x01a\t\xDA\x91\x90aW\xFCV[`@Q\x80\x91\x03\x90\xFD[a\t\xF0\x84`@\x01Qa\x12\x87V[a\t\xFD\x84``\x01Qa\x12\x87V[a\n\n\x84`\x80\x01Qa\x12\x87V[a\n\x17\x84`\xA0\x01Qa\x12\x87V[a\n$\x84`\xC0\x01Qa\x12\x87V[\x80\x15a\n2Wa\n2a\x12\xE3V[a\n<\x84\x84a\x14.V[`\0\x80T`\x01`@\x1B\x90\x81\x90\x04c\xFF\xFF\xFF\xFF\x16\x82R`\x05` \x81\x81R`@\x80\x85 \x89Q\x81T\x8B\x85\x01\x80Q`\x01`\x01`@\x1B\x03\x93\x84\x16`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x92\x90\x92\x17\x91\x83\x16\x90\x97\x02\x17\x82U\x8A\x83\x01\x80Q`\x01\x80\x85\x01\x91\x90\x91U``\x8D\x01Q`\x02\x80\x86\x01\x91\x90\x91U`\x80\x8E\x01Q`\x03\x86\x01U`\xA0\x8E\x01Q`\x04\x86\x01U`\xC0\x8E\x01Q\x97\x85\x01\x97\x90\x97U`\xE0\x8D\x01Q`\x06\x90\x94\x01\x93\x90\x93U`\x07\x80T\x80\x85\x01\x82U\x90\x89RC`\0\x80Q` a]\\\x839\x81Q\x91R\x90\x91\x01U\x83Q\x80\x85\x01\x85R\x87Q\x83\x16\x81R\x81Q\x81\x87\x01\x90\x81R`\x08\x80T\x95\x86\x01\x81U\x90\x99RQ`\0\x80Q` a]\xDC\x839\x81Q\x91R\x93\x90\x96\x02\x92\x83\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x96\x83\x16\x96\x90\x96\x17\x90\x95U\x95Q`\0\x80Q` a^\x1C\x839\x81Q\x91R\x90\x91\x01U\x92Q\x88Q\x92Q\x93Q\x93\x84R\x84\x16\x93\x91\x90\x91\x16\x91\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x91\x01`@Q\x80\x91\x03\x90\xA3PPPPV[a\x0B\xA3aO\xFAV[P`\0\x80T`\x01` \x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05` \x81\x81R`@\x92\x83\x90 \x83Qa\x01\0\x81\x01\x85R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R`\x01`@\x1B\x90\x91\x04\x16\x92\x81\x01\x92\x90\x92R`\x01\x81\x01T\x93\x82\x01\x93\x90\x93R`\x02\x83\x01T``\x82\x01R`\x03\x83\x01T`\x80\x82\x01R`\x04\x83\x01T`\xA0\x82\x01R\x90\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[a\x0C5a\x16\x1EV[a\x0C>\x82a\x16\xC3V[a\x08l\x82\x82a\x16\xFAV[`\0a\x0CRa\x17\xB3V[P`\0\x80Q` a]\x9C\x839\x81Q\x91R\x90V[a\x0Cq`\x08`\0aPQV[`\0[\x81Q\x81\x10\x15a\x08lW`\x08\x82\x82\x81Q\x81\x10a\x0C\x91Wa\x0C\x91aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x80\x82\x01\x85U`\0\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x81U\x91\x01Q\x90\x82\x01U\x01a\x0CtV[a\x0C\xE9a\x12UV[`\x06T`\x01`\xA0\x1B\x90\x04`\xFF\x16\x15a\r6W`\x06\x80T`\x01`\x01`\xA8\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\rYa\x12UV[a\rO`\0a\x17\xFCV[a\rkaO\xFAV[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\x08\x80T\x90a\x0E\x17`\x01\x83aYgV[\x81T\x81\x10a\x0E'Wa\x0E'aYQV[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x83\x10a\x0E`W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x81\x81\x10\x15a\x0E\xF5W\x83`\x08\x82\x81T\x81\x10a\x0E\x7FWa\x0E\x7FaYQV[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11\x15a\x0E\xEDW`\x08\x81\x81T\x81\x10a\x0E\xB2Wa\x0E\xB2aYQV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q\x80\x82\x01\x90\x91R`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x16\x82R`\x01\x01T\x91\x81\x01\x91\x90\x91R\x94\x93PPPPV[`\x01\x01a\x0EcV[P`\x08a\x0F\x03`\x01\x83aYgV[\x81T\x81\x10a\x0F\x13Wa\x0F\x13aYQV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q\x80\x82\x01\x90\x91R`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x16\x82R`\x01\x01T\x91\x81\x01\x91\x90\x91R\x93\x92PPPV[`\0\x80a\x0FXa\x18XV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x0Fra\x18|V[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x0F\x99WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0F\xB5WP0;\x15[\x90P\x81\x15\x80\x15a\x0F\xC3WP\x80\x15[\x15a\x0F\xE1W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x10\nW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x10\x13\x86a\x18\xA0V[a\x10\x1Ba\x18\xB1V[`\0\x80T`\x01` \x1B`\x01``\x1B\x03\x19\x16`\x01`@\x1B\x17\x90Ua\x10>\x88\x88a\x18\xB9V[\x83\x15a\x10\x89W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90a\x10\x80\x90`\x01\x90aW\xFCV[`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\x07\x81\x81T\x81\x10a\x10\xA3W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 \x01T\x90P\x81V[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x08\x81\x81T\x81\x10a\x11\x0CW`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x90\x91\x16\x91P\x82V[`\x07T`\0\x90C\x84\x11\x80a\x11HWP`\x03\x81\x10[\x15a\x11fW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x11u`\x01\x85aYgV[\x90P[\x81a\x11\xE0W\x86`\x07\x82\x81T\x81\x10a\x11\x91Wa\x11\x91aYQV[\x90`\0R` `\0 \x01T\x11a\x11\xC6W`\x01\x91P`\x07\x81\x81T\x81\x10a\x11\xB8Wa\x11\xB8aYQV[\x90`\0R` `\0 \x01T\x92P[`\x02\x81\x10a\x11\xE0W\x80a\x11\xD8\x81aYzV[\x91PPa\x11xV[\x81a\x11\xFEW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x12\t\x84\x89aYgV[\x11\x94PPPPP[\x92\x91PPV[a\x12\x1Fa\x12UV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x12IW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[a\x12R\x81a\x17\xFCV[PV[3a\x12^a\x0FMV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\rOW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[`\0\x80Q` a]\xBC\x839\x81Q\x91R\x81\x10\x80a\x08lW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01Rz\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x1C\xD8\xD8[\x18\\\x88\x19\x9AY[\x19`*\x1B`D\x82\x01R`d\x01a\t\xDAV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x80\x85 \x81Qa\x01\0\x81\x01\x83R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x96\x90\x04\x90\x95\x16\x92\x85\x01\x92\x90\x92R`\x01\x82\x01T\x90\x84\x01R`\x02\x81\x01T``\x84\x01R`\x03\x81\x01T`\x80\x84\x01R`\x04\x81\x01T`\xA0\x84\x01R\x90\x81\x01T`\xC0\x83\x01R`\x06\x01T`\xE0\x82\x01Ra\x13k\x90a\x10\xB4V[`\x03\x80T`\x01\x90\x81U\x90\x82\x90U`\x04\x80T`\x02U`\0\x80T`\x01`@\x1B\x81\x04c\xFF\xFF\xFF\xFF\x16\x82R`\x05` R`@\x82 `\x06\x01T\x90\x92U\x92\x93P\x90\x91\x90`\x0C\x90a\x13\xC6\x90\x84\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16aY\x91V[\x92Pa\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?`\0`\x0C\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16`@Qa\x08B\x91\x90aW\xFCV[`\0a\x148a\x1B\xDCV[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x14wWa\x14waYQV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x01\x81Q\x81\x10a\x14\xA4Wa\x14\xA4aYQV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x02\x81Q\x81\x10a\x14\xD1Wa\x14\xD1aYQV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x14\xF5Wa\x14\xF5aYQV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x15\x19Wa\x15\x19aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x15]Wa\x15]aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x15\xA1Wa\x15\xA1aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x15\xE4Wa\x15\xE4aYQV[` \x02` \x01\x01\x81\x81RPPa\x15\xFB\x82\x82\x85a!\xBDV[a\x16\x18W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x16\xA5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x16\x99`\0\x80Q` a]\x9C\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\rOW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\xCBa\x12UV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x08B\x91\x90aS\xD5V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x17TWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x17Q\x91\x81\x01\x90aY\xB1V[`\x01[a\x17sW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[`\0\x80Q` a]\x9C\x839\x81Q\x91R\x81\x14a\x17\xA4W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\t\xDAV[a\x17\xAE\x83\x83a\"\xA8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\rOW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x18\x06a\x18XV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x18\xA8a\"\xFEV[a\x12R\x81a##V[a\rOa\"\xFEV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x18\xDDWP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x18\xEAWP`\x80\x82\x01Q\x15[\x80a\x18\xF7WP`\xA0\x82\x01Q\x15[\x80a\x19\x04WP`\xC0\x82\x01Q\x15[\x80a\x19\x11WP`\xE0\x82\x01Q\x15[\x80a\x19 WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x19>W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x1B$\x83a\x10\xB4V[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` a]\\\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` a]\xDC\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` a^\x1C\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x1B\xE4aPrV[b\x01\0\0\x81R`\x08` \x82\x01R\x7F\x01=\x1DKBQy%\x8BWx`9yU\xCB\xFA\x08\x16\xE3+\x1C%\xA1\xFDsL\x91\xB9Q\xEE\x81`@\x82\x01QR\x7F\x16\xB8\x8D\xC7C\x9Am\x84\x1E\x1A\x11\x03\xF5\xA3\xD2\xD2D\x017\xF1\x8D\x02v5\x03\xBA\xC7\xB4]\xCB\x98;` `@\x83\x01Q\x01R\x7F\x0C<\x86O\x19_Y\x11\x99'\xF58W\xF1\xDE\x8B\xF5u\x94\x17H\xB755\x1F\xD3\x13s\xC7\x87\\-``\x82\x01QR\x7F\x16\x9B\xA1Q\x07\xF2\xEF\xF9\xB94\x1B\xF3\x07B\xA88\xD2}\xBDi\xE8\x8B#S\xDC\xA8Y/\x15\xF1\x11\x1C` ``\x83\x01Q\x01R\x7F\x11\xD4\xCE\xB1Ya\xD1\x0BaV\xAE=\t\xBBx\xB4\xDFE\xFB\x85C\x06\x08\x84\xE7\xD4\0u[\xEBJ\xC8`\x80\x82\x01QR\x7F\x03&\xFF\x069\x1E\xD5\xD2n\xC1\xBC\x08\x0B\x8DF\x01N\xE2,\x0Ch\xED\x02/\x16 \xC4\xD9\xD3\x847\xD3` `\x80\x83\x01Q\x01R\x7F#a\x0C\xB4>!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a!\xC8\x82a#+V[a!\xEB\x83`\0\x81Q\x81\x10a!\xDEWa!\xDEaYQV[` \x02` \x01\x01Qa\x12\x87V[a\"\x01\x83`\x01\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"\x17\x83`\x02\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"-\x83`\x03\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"C\x83`\x04\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"Y\x83`\x05\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"o\x83`\x06\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"\x85\x83`\x07\x81Q\x81\x10a!\xDEWa!\xDEaYQV[`\0a\"\x92\x85\x85\x85a$cV[\x90Pa\"\x9D\x81a%\xADV[\x91PP[\x93\x92PPPV[a\"\xB1\x82a*\x0CV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\"\xF6Wa\x17\xAE\x82\x82a*hV[a\x08la*\xDEV[a#\x06a*\xFDV[a\rOW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x12\x1Fa\"\xFEV[\x80Qa#6\x90a+\x17V[a#C\x81` \x01Qa+\x17V[a#P\x81`@\x01Qa+\x17V[a#]\x81``\x01Qa+\x17V[a#j\x81`\x80\x01Qa+\x17V[a#w\x81`\xA0\x01Qa+\x17V[a#\x84\x81`\xC0\x01Qa+\x17V[a#\x91\x81`\xE0\x01Qa+\x17V[a#\x9F\x81a\x01\0\x01Qa+\x17V[a#\xAD\x81a\x01 \x01Qa+\x17V[a#\xBB\x81a\x01@\x01Qa+\x17V[a#\xC9\x81a\x01`\x01Qa+\x17V[a#\xD7\x81a\x01\x80\x01Qa+\x17V[a#\xE5\x81a\x01\xA0\x01Qa\x12\x87V[a#\xF3\x81a\x01\xC0\x01Qa\x12\x87V[a$\x01\x81a\x01\xE0\x01Qa\x12\x87V[a$\x0F\x81a\x02\0\x01Qa\x12\x87V[a$\x1D\x81a\x02 \x01Qa\x12\x87V[a$+\x81a\x02@\x01Qa\x12\x87V[a$9\x81a\x02`\x01Qa\x12\x87V[a$G\x81a\x02\x80\x01Qa\x12\x87V[a$U\x81a\x02\xA0\x01Qa\x12\x87V[a\x12R\x81a\x02\xC0\x01Qa\x12\x87V[a$kaQvV[\x83` \x01Q\x83Q\x14a$\x90W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a$\x9D\x85\x85\x85a+\xA5V[\x90P`\0a$\xAE\x86`\0\x01Qa.\xC4V[\x90P`\0a$\xC1\x82\x84`\xA0\x01Q\x88a2\x8FV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a%\x0CaQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x04W\x90PP\x90P`\0a%1\x8A\x85\x8A\x89\x87\x87a2\xEFV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` a]\xBC\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` a]\xBC\x839\x81Q\x91Ra%\xC6aQ\xB0V[a%\xCEaQ\xB0V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a&\x10aQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x08W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a&?Wa&?aYQV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&cWa&caYQV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&\x86Wa&\x86aYQV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&\xAAWa&\xAAaYQV[` \x02` \x01\x01\x81\x90RPa&\xBF\x82\x84a3$V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\xDE\x82`\x02aY\xCAV[a&\xE9\x90`\x01aY\xCAV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\x03Wa'\x03aRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a',W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'GWa'GaRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'\x80W\x81` \x01[a'maQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a'eW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a($W\x89`\x80\x01Q\x81\x81Q\x81\x10a'\xAEWa'\xAEaYQV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'\xC8Wa'\xC8aYQV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\xEAWa'\xEAaYQV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a(\x04Wa(\x04aYQV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x1A`\x01\x83aY\xCAV[\x91P`\x01\x01a'\x8BV[P\x88` \x01Q\x84\x82\x81Q\x81\x10a(a*\xC5V[``\x91P[P\x91P\x91Pa*\xD5\x85\x83\x83a6\x86V[\x95\x94PPPPPV[4\x15a\rOW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a+\x07a\x18|V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` a]<\x839\x81Q\x91Ra+1\x83a6\xD9V[\x15a+;WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x17\xAEW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\t\xDAV[a+\xED`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` a]\xBC\x839\x81Q\x91Ra,\x1C\x82\x87\x87a6\xE8V[\x81Q\x84Qa,)\x90a:\x81V[a,6\x86` \x01Qa:\x81V[a,C\x87`@\x01Qa:\x81V[a,P\x88``\x01Qa:\x81V[a,]\x89`\x80\x01Qa:\x81V[`@Q` \x01a,r\x96\x95\x94\x93\x92\x91\x90aY\xF9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\x8D\x82a:\xF6V[Pa,\x97\x82a:\xF6V[``\x84\x01Ra,\xA5\x82a:\xF6V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\xBA\x90a:\x81V[`@Q` \x01a,\xCB\x92\x91\x90aZxV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xE6\x82a:\xF6V[\x83R\x81Q`\xC0\x85\x01Qa,\xF8\x90a:\x81V[a-\x05\x86`\xE0\x01Qa:\x81V[a-\x13\x87a\x01\0\x01Qa:\x81V[a-!\x88a\x01 \x01Qa:\x81V[a-/\x89a\x01@\x01Qa:\x81V[`@Q` \x01a-D\x96\x95\x94\x93\x92\x91\x90aY\xF9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-_\x82a:\xF6V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa-u\x90a;XV[a-\x83\x86a\x01\xC0\x01Qa;XV[a-\x91\x87a\x01\xE0\x01Qa;XV[a-\x9F\x88a\x02\0\x01Qa;XV[a-\xAD\x89a\x02 \x01Qa;XV[`@Q` \x01a-\xC2\x96\x95\x94\x93\x92\x91\x90aZ\xA7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-\xE4\x90a;XV[a-\xF2\x86a\x02`\x01Qa;XV[a.\0\x87a\x02\x80\x01Qa;XV[a.\x0E\x88a\x02\xA0\x01Qa;XV[a.\x1C\x89a\x02\xC0\x01Qa;XV[`@Q` \x01a.1\x96\x95\x94\x93\x92\x91\x90aZ\xA7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.L\x82a:\xF6V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa.b\x90a:\x81V[a.p\x86a\x01\x80\x01Qa:\x81V[`@Q` \x01a.\x82\x93\x92\x91\x90aZ\xE3V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\x9D\x82a:\xF6V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.\xF6`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a/\x8AWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a0\x1FWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\xB4WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a1IWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a1\xDEWP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a2qWP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\xB3`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2\xBD\x84\x84a<\x8FV[\x80\x82Ra2\xCD\x90\x85\x90\x85\x90a<\xE3V[` \x82\x01R\x80Qa2\xE3\x90\x85\x90\x84\x90\x86\x90a=WV[`@\x82\x01R\x93\x92PPPV[`\0\x80a2\xFD\x85\x87\x89a?\x0BV[\x90Pa3\r\x88\x86\x89\x89\x88\x88a?\xF7V[a3\x18\x81\x87\x86aC\x03V[\x98\x97PPPPPPPPV[a3,aQ\xB0V[\x82Q\x82Q\x14a3}W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\t\xDAV[a3\xBB\x83`\0\x81Q\x81\x10a3\x93Wa3\x93aYQV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3\xAEWa3\xAEaYQV[` \x02` \x01\x01QaCSV[\x90P`\x01[\x82Q\x81\x10\x15a4\x0BWa4\x01\x82a3\xFC\x86\x84\x81Q\x81\x10a3\xE2Wa3\xE2aYQV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3\xAEWa3\xAEaYQV[aC\xE7V[\x91P`\x01\x01a3\xC0V[P\x92\x91PPV[`\0a4,`\0\x80Q` a]\xBC\x839\x81Q\x91R\x83a[\x0EWa>\x0EaRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a>|W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>GV[Pa>\x86\x83aE\xB8V[\x92P`\0[\x88\x81\x10\x15a>\xF9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a>\xD8W\x80\x82\x14a>\xD0W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a>\xAEV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a>\x8BV[PPPPPPPPPP\x94\x93PPPPV[`\0\x80`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\x05\x86\x86\x86\x86\x85\x87aG#V[`\xC0\x85\x01Q\x82Q`\0\x80Q` a]\xBC\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a@4Wa@4aYQV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a@XWa@XaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a@}Wa@}aYQV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a@\xA1Wa@\xA1aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a@\xC6Wa@\xC6aYQV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a@\xEAWa@\xEAaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\x0FWaA\x0FaYQV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aA3WaA3aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aAXWaAXaYQV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aA|WaA|aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aA\xA1WaA\xA1aYQV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aA\xC5WaA\xC5aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aA\xEAWaA\xEAaYQV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\x0EWaB\x0EaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aB3WaB3aYQV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aBWWaBWaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aB|WaB|aYQV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aB\xA0WaB\xA0aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aB\xC9WaB\xC9aYQV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aB\xEDWaB\xEDaYQV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` a]\xBC\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aCJW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aC\x19V[PP\x93\x92PPPV[aC[aQ\xB0V[aCcaQ\xCAV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aC\x95W`\0\x80\xFD[P\x80aC\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\t\xDAV[PP\x92\x91PPV[aC\xEFaQ\xB0V[aC\xF7aQ\xE8V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aD4W`\0\x80\xFD[P\x80aC\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\t\xDAV[\x80Q\x15aD\x92W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aD\xB9\x81`\x1FaY\xCAV[\x10\x15aD\xF8W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\t\xDAV[aE\x02\x82\x84aY\xCAV[\x84Q\x10\x15aEFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\t\xDAV[``\x82\x15\x80\x15aEeW`@Q\x91P`\0\x82R` \x82\x01`@RaE\xAFV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aE\x9EW\x80Q\x83R` \x92\x83\x01\x92\x01aE\x86V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aFWW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\t\xDAV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aF\x85W`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` a]\xBC\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aF\xB3WaF\xB3aRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aF\xDCW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a<\xDAW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aG\x18W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaF\xFCV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\\\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a]\xFC\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^<\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a]|\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aHRWaHRaYQV[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aHqWaHqaYQV[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aISWaISaYQV[` \x90\x81\x02\x91\x90\x91\x01\x01RaIh\x85\x82aYgV[\x87`\x01\x81Q\x81\x10aI{WaI{aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aI\xA0WaI\xA0aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aI\xC5WaI\xC5aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aI\xEAWaI\xEAaYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aJ\x0FWaJ\x0FaYQV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aJ3WaJ3aYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aJWWaJWaYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aJ{WaJ{aYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aJ\x9FWaJ\x9FaYQV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aJ\xCEWaJ\xCEaYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aJ\xF3WaJ\xF3aYQV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aK\"WaK\"aYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aKGWaKGaYQV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aK\x80WaK\x80aYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aK\xA5WaK\xA5aYQV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aK\xDEWaK\xDEaYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aL\x03WaL\x03aYQV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aL v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0C\xF7a\x10{V[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\rmW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\r\xA9a\x10{V[a\r\x9F`\0a\x17@V[a\x0E\x0F`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x0E\xDEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x0E\xFBWP0;\x15[\x90P\x81\x15\x80\x15a\x0F\tWP\x80\x15[\x15a\x0F@W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0F\x86W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16`\x01`@\x1B\x17\x85U[a\x0F\x8F\x86a\x17\xC9V[a\x0F\x97a\x17\xDAV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16`\x01`@\x1B\x17\x90Ua\x0F\xCF\x88\x88a\x17\xE2V[\x83\x15a\x10\x1AW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x10,a\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10oW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\nvV[a\x10x\x81a\x17@V[PV[3a\x10\xAD\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\r\x9FW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\nvV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0C\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[`\0\x80T`\x01`@\x1B\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x12T\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aZ\xD1V[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x08vV[`\0a\x12\xC6a\x1A\xD2V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x13\x05Wa\x13\x05aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x133Wa\x133aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x13aWa\x13aaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x13\x85Wa\x13\x85aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x13\xA9Wa\x13\xA9aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x13\xEDWa\x13\xEDaZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x141Wa\x141aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x14tWa\x14taZ\xF2V[` \x02` \x01\x01\x81\x81RPPa\x14\x8B\x82\x82\x85a \xB3V[a\x14\xC1W`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x15`WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x15T\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\x9Fa\x10{V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08vV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x162WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x16/\x91\x81\x01\x90a[\x08V[`\x01[a\x16sW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x16\xCFW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\nvV[a\x16\xD9\x83\x83a!\x9EV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x17\xD1a!\xF4V[a\x10x\x81a\"VV[a\r\x9Fa!\xF4V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x18\x08WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x18\x15WP`\x80\x82\x01Q\x15[\x80a\x18\"WP`\xA0\x82\x01Q\x15[\x80a\x18/WP`\xC0\x82\x01Q\x15[\x80a\x18!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a \xBE\x82a\"^V[a \xE1\x83`\0\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[` \x02` \x01\x01Qa\x10\xEFV[a \xF7\x83`\x01\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!\r\x83`\x02\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!#\x83`\x03\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!9\x83`\x04\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!O\x83`\x05\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!e\x83`\x06\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[a!{\x83`\x07\x81Q\x81\x10a \xD4Wa \xD4aZ\xF2V[`\0a!\x88\x85\x85\x85a#\x96V[\x90Pa!\x93\x81a%\x17V[\x91PP[\x93\x92PPPV[a!\xA7\x82a)\xDFV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\xECWa\x16\xD9\x82\x82a*\x87V[a\x0C\xBCa*\xFFV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\r\x9FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10,a!\xF4V[\x80Qa\"i\x90a+7V[a\"v\x81` \x01Qa+7V[a\"\x83\x81`@\x01Qa+7V[a\"\x90\x81``\x01Qa+7V[a\"\x9D\x81`\x80\x01Qa+7V[a\"\xAA\x81`\xA0\x01Qa+7V[a\"\xB7\x81`\xC0\x01Qa+7V[a\"\xC4\x81`\xE0\x01Qa+7V[a\"\xD2\x81a\x01\0\x01Qa+7V[a\"\xE0\x81a\x01 \x01Qa+7V[a\"\xEE\x81a\x01@\x01Qa+7V[a\"\xFC\x81a\x01`\x01Qa+7V[a#\n\x81a\x01\x80\x01Qa+7V[a#\x18\x81a\x01\xA0\x01Qa\x10\xEFV[a#&\x81a\x01\xC0\x01Qa\x10\xEFV[a#4\x81a\x01\xE0\x01Qa\x10\xEFV[a#B\x81a\x02\0\x01Qa\x10\xEFV[a#P\x81a\x02 \x01Qa\x10\xEFV[a#^\x81a\x02@\x01Qa\x10\xEFV[a#l\x81a\x02`\x01Qa\x10\xEFV[a#z\x81a\x02\x80\x01Qa\x10\xEFV[a#\x88\x81a\x02\xA0\x01Qa\x10\xEFV[a\x10x\x81a\x02\xC0\x01Qa\x10\xEFV[a#\x9EaT\xDDV[\x83` \x01Q\x83Q\x14a#\xDCW`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\xE9\x85\x85\x85a+\xE1V[\x90P`\0a#\xFA\x86`\0\x01Qa/\x12V[\x90P`\0a$\r\x82\x84`\xA0\x01Q\x88a2\xF6V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$PW\x90PP\x90P`\0a$\x89\x8A\x85\x8A\x89\x87\x87a3VV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a%\xE0Wa%\xE0aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\x04Wa&\x04aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&'Wa&'aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&KWa&KaZ\xF2V[` \x02` \x01\x01\x81\x90RPa&`\x82\x84a3\x8BV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\x7F\x82`\x02a[!V[a&\x8A\x90`\x01a[!V[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xA5Wa&\xA5aU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&\xCEW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xEAWa&\xEAaU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'/W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\x08W\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a'\xD3W\x89`\x80\x01Q\x81\x81Q\x81\x10a']Wa']aZ\xF2V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'wWa'waZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\x99Wa'\x99aZ\xF2V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a'\xB3Wa'\xB3aZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\xC9`\x01\x83a[!V[\x91P`\x01\x01a':V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a'\xEBWa'\xEBaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\x0EWa(\x0EaZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra($`\x01\x82a[!V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a(JWa(JaZ\xF2V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a(pWa(paZ\xF2V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x86`\x01\x82a[!V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa(\x9E\x82a4\x85V[\x84\x82\x81Q\x81\x10a(\xB0Wa(\xB0aZ\xF2V[` \x02` \x01\x01\x81\x81RPPa(\xE8`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a(\xFAWa(\xFAaZ\xF2V[` \x02` \x01\x01\x81\x90RPa)\x17a)\x12\x84\x86a3\x8BV[a4\xDBV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa)\xD5\x83\x82\x84a)\xD0a5zV[a6KV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*.W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa*\xA4\x91\x90a[4V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a*\xDFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a*\xE4V[``\x91P[P\x91P\x91Pa*\xF4\x85\x83\x83a7/V[\x92PPP[\x92\x91PPV[4\x15a\r\x9FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a+qWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x16\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[a,)`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a,j\x82\x87\x87a7\xA4V[\x81Q\x84Qa,w\x90a;\x85V[a,\x84\x86` \x01Qa;\x85V[a,\x91\x87`@\x01Qa;\x85V[a,\x9E\x88``\x01Qa;\x85V[a,\xAB\x89`\x80\x01Qa;\x85V[`@Q` \x01a,\xC0\x96\x95\x94\x93\x92\x91\x90a[PV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xDB\x82a\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3\x1A`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3$\x84\x84a>\x08V[\x80\x82Ra34\x90\x85\x90\x85\x90a>nV[` \x82\x01R\x80Qa3J\x90\x85\x90\x84\x90\x86\x90a>\xF4V[`@\x82\x01R\x93\x92PPPV[`\0\x80a3d\x85\x87\x89a@\xBBV[\x90Pa3t\x88\x86\x89\x89\x88\x88aA\xB9V[a3\x7F\x81\x87\x86aD\xD7V[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a3\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\nvV[a4.\x83`\0\x81Q\x81\x10a4\x06Wa4\x06aZ\xF2V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4!Wa4!aZ\xF2V[` \x02` \x01\x01QaE9V[\x90P`\x01[\x82Q\x81\x10\x15a4~Wa4t\x82a4o\x86\x84\x81Q\x81\x10a4UWa4UaZ\xF2V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4!Wa4!aZ\xF2V[aE\xDDV[\x91P`\x01\x01a43V[P\x92\x91PPV[`\0a4\xB1\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a\\\x93V[a*\xF9\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\\\xB5V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a5\x03WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa5H\x91\x90a\\\x93V[a5r\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\\\xB5V[\x90R\x92\x91PPV[a5\xA5`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7!W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\nvV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a7DWa7?\x82aF\x84V[a!\x97V[\x81Q\x15\x80\x15a7[WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7\x9DW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\nvV[P\x80a!\x97V[\x82Q`\xFE\x90a7\xDFa7\xB5\x83a<\xBCV[`@Q` \x01a7\xC7\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aF\xC6V[a8\x19a7\xEF\x86`\0\x01Qa<\xBCV[`@Q` \x01a8\x01\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aF\xC6V[a8)a7\xEF\x87` \x01Qa<\xBCV[`@Q` \x01a8<\x94\x93\x92\x91\x90a\\\xC8V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra8Y`\x01a<\xBCV[a8\x82\x7F/\x8D\xD1\xF1\xA7X^W\x84\x93P`\0[\x82\x81\x10\x15a>RW\x83\x85\x86\t\x94P`\x01\x01a>eV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a>\x80WP`\x01a!\x97V[\x81`\0\x03a>\x90WP`\0a!\x97V[`@\x84\x01Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a>\xD2W`\x01\x87\x03\x92Pa>\xD9V[`\x01\x84\x03\x92P[Pa>\xE3\x82aG\xEEV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90\x83\x83\x03a?\x87W`\x01`\0[\x82\x81\x10\x15a?zW\x81\x87\x03a?[W\x87\x81\x81Q\x81\x10a?HWa?HaZ\xF2V[` \x02` \x01\x01Q\x94PPPPPa7'V[\x83\x80a?iWa?ia\\}V[\x89``\x01Q\x83\t\x91P`\x01\x01a?'V[P`\0\x93PPPPa7'V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a?\xA1\x8D\x88aH\xA6V[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xBEWa?\xBEaU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a?\xE7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a@,W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a?\xF7V[Pa@6\x83aG\xEEV[\x92P`\0[\x88\x81\x10\x15a@\xA9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a@\x88W\x80\x82\x14a@\x80W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a@^V[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a@;V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[aA\xC7\x86\x86\x86\x86\x85\x87aI\x97V[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aB\x08WaB\x08aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aB,WaB,aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aBQWaBQaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aBuWaBuaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aB\x9AWaB\x9AaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aB\xBEWaB\xBEaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aB\xE3WaB\xE3aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aC\x07WaC\x07aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aC,WaC,aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aCPWaCPaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aCuWaCuaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aC\x99WaC\x99aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aC\xBEWaC\xBEaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aC\xE2WaC\xE2aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aD\x07WaD\x07aZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aD+WaD+aZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aDPWaDPaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aDtWaDtaZ\xF2V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aD\x9DWaD\x9DaZ\xF2V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aD\xC1WaD\xC1aZ\xF2V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aE0W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\xFFV[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaEUaU0V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aE\x87W`\0\x80\xFD[P\x80aE\xD5W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\xF9aUNV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aF6W`\0\x80\xFD[P\x80aE\xD5W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\nvV[\x80Q\x15aF\x94W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aF\xD4\x81`\x1Fa[!V[\x10\x15aG\"W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[aG,\x82\x84a[!V[\x84Q\x10\x15aG|W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[``\x82\x15\x80\x15aG\x9BW`@Q\x91P`\0\x82R` \x82\x01`@RaG\xE5V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aG\xD4W\x80Q\x83R` \x92\x83\x01\x92\x01aG\xBCV[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aH\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aH\xE6W`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI'WaI'aU\x9EV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aIPW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a>eW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aI\x8CW\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaIpV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X\x82a\x16\xC3V[a\x08l\x82\x82a\x16\xFAV[`\0a\x0CRa\x17\xB3V[P`\0\x80Q` a]\x9C\x839\x81Q\x91R\x90V[a\x0Cq`\x08`\0aPQV[`\0[\x81Q\x81\x10\x15a\x08lW`\x08\x82\x82\x81Q\x81\x10a\x0C\x91Wa\x0C\x91aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x80\x82\x01\x85U`\0\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x81U\x91\x01Q\x90\x82\x01U\x01a\x0CtV[a\x0C\xE9a\x12UV[`\x06T`\x01`\xA0\x1B\x90\x04`\xFF\x16\x15a\r6W`\x06\x80T`\x01`\x01`\xA8\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\rYa\x12UV[a\rO`\0a\x17\xFCV[a\rkaO\xFAV[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\x08\x80T\x90a\x0E\x17`\x01\x83aYgV[\x81T\x81\x10a\x0E'Wa\x0E'aYQV[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x83\x10a\x0E`W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x81\x81\x10\x15a\x0E\xF5W\x83`\x08\x82\x81T\x81\x10a\x0E\x7FWa\x0E\x7FaYQV[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11\x15a\x0E\xEDW`\x08\x81\x81T\x81\x10a\x0E\xB2Wa\x0E\xB2aYQV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q\x80\x82\x01\x90\x91R`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x16\x82R`\x01\x01T\x91\x81\x01\x91\x90\x91R\x94\x93PPPPV[`\x01\x01a\x0EcV[P`\x08a\x0F\x03`\x01\x83aYgV[\x81T\x81\x10a\x0F\x13Wa\x0F\x13aYQV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q\x80\x82\x01\x90\x91R`\x02\x90\x92\x02\x01\x80T`\x01`\x01`@\x1B\x03\x16\x82R`\x01\x01T\x91\x81\x01\x91\x90\x91R\x93\x92PPPV[`\0\x80a\x0FXa\x18XV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x0Fra\x18|V[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x0F\x99WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0F\xB5WP0;\x15[\x90P\x81\x15\x80\x15a\x0F\xC3WP\x80\x15[\x15a\x0F\xE1W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x10\nW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x10\x13\x86a\x18\xA0V[a\x10\x1Ba\x18\xB1V[`\0\x80T`\x01` \x1B`\x01``\x1B\x03\x19\x16`\x01`@\x1B\x17\x90Ua\x10>\x88\x88a\x18\xB9V[\x83\x15a\x10\x89W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90a\x10\x80\x90`\x01\x90aW\xFCV[`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\x07\x81\x81T\x81\x10a\x10\xA3W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 \x01T\x90P\x81V[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x08\x81\x81T\x81\x10a\x11\x0CW`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x90\x91\x16\x91P\x82V[`\x07T`\0\x90C\x84\x11\x80a\x11HWP`\x03\x81\x10[\x15a\x11fW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x11u`\x01\x85aYgV[\x90P[\x81a\x11\xE0W\x86`\x07\x82\x81T\x81\x10a\x11\x91Wa\x11\x91aYQV[\x90`\0R` `\0 \x01T\x11a\x11\xC6W`\x01\x91P`\x07\x81\x81T\x81\x10a\x11\xB8Wa\x11\xB8aYQV[\x90`\0R` `\0 \x01T\x92P[`\x02\x81\x10a\x11\xE0W\x80a\x11\xD8\x81aYzV[\x91PPa\x11xV[\x81a\x11\xFEW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x12\t\x84\x89aYgV[\x11\x94PPPPP[\x92\x91PPV[a\x12\x1Fa\x12UV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x12IW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[a\x12R\x81a\x17\xFCV[PV[3a\x12^a\x0FMV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\rOW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[`\0\x80Q` a]\xBC\x839\x81Q\x91R\x81\x10\x80a\x08lW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01Rz\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x1C\xD8\xD8[\x18\\\x88\x19\x9AY[\x19`*\x1B`D\x82\x01R`d\x01a\t\xDAV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x80\x85 \x81Qa\x01\0\x81\x01\x83R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x96\x90\x04\x90\x95\x16\x92\x85\x01\x92\x90\x92R`\x01\x82\x01T\x90\x84\x01R`\x02\x81\x01T``\x84\x01R`\x03\x81\x01T`\x80\x84\x01R`\x04\x81\x01T`\xA0\x84\x01R\x90\x81\x01T`\xC0\x83\x01R`\x06\x01T`\xE0\x82\x01Ra\x13k\x90a\x10\xB4V[`\x03\x80T`\x01\x90\x81U\x90\x82\x90U`\x04\x80T`\x02U`\0\x80T`\x01`@\x1B\x81\x04c\xFF\xFF\xFF\xFF\x16\x82R`\x05` R`@\x82 `\x06\x01T\x90\x92U\x92\x93P\x90\x91\x90`\x0C\x90a\x13\xC6\x90\x84\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16aY\x91V[\x92Pa\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?`\0`\x0C\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16`@Qa\x08B\x91\x90aW\xFCV[`\0a\x148a\x1B\xDCV[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x14wWa\x14waYQV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x01\x81Q\x81\x10a\x14\xA4Wa\x14\xA4aYQV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x02\x81Q\x81\x10a\x14\xD1Wa\x14\xD1aYQV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x14\xF5Wa\x14\xF5aYQV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x15\x19Wa\x15\x19aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x15]Wa\x15]aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x15\xA1Wa\x15\xA1aYQV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x15\xE4Wa\x15\xE4aYQV[` \x02` \x01\x01\x81\x81RPPa\x15\xFB\x82\x82\x85a!\xBDV[a\x16\x18W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x16\xA5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x16\x99`\0\x80Q` a]\x9C\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\rOW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\xCBa\x12UV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x08B\x91\x90aS\xD5V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x17TWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x17Q\x91\x81\x01\x90aY\xB1V[`\x01[a\x17sW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\t\xDA\x91\x90aS\xD5V[`\0\x80Q` a]\x9C\x839\x81Q\x91R\x81\x14a\x17\xA4W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\t\xDAV[a\x17\xAE\x83\x83a\"\xA8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\rOW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x18\x06a\x18XV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x18\xA8a\"\xFEV[a\x12R\x81a##V[a\rOa\"\xFEV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x18\xDDWP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x18\xEAWP`\x80\x82\x01Q\x15[\x80a\x18\xF7WP`\xA0\x82\x01Q\x15[\x80a\x19\x04WP`\xC0\x82\x01Q\x15[\x80a\x19\x11WP`\xE0\x82\x01Q\x15[\x80a\x19 WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x19>W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x1B$\x83a\x10\xB4V[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` a]\\\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` a]\xDC\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` a^\x1C\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x1B\xE4aPrV[b\x01\0\0\x81R`\x08` \x82\x01R\x7F\x01=\x1DKBQy%\x8BWx`9yU\xCB\xFA\x08\x16\xE3+\x1C%\xA1\xFDsL\x91\xB9Q\xEE\x81`@\x82\x01QR\x7F\x16\xB8\x8D\xC7C\x9Am\x84\x1E\x1A\x11\x03\xF5\xA3\xD2\xD2D\x017\xF1\x8D\x02v5\x03\xBA\xC7\xB4]\xCB\x98;` `@\x83\x01Q\x01R\x7F\x0C<\x86O\x19_Y\x11\x99'\xF58W\xF1\xDE\x8B\xF5u\x94\x17H\xB755\x1F\xD3\x13s\xC7\x87\\-``\x82\x01QR\x7F\x16\x9B\xA1Q\x07\xF2\xEF\xF9\xB94\x1B\xF3\x07B\xA88\xD2}\xBDi\xE8\x8B#S\xDC\xA8Y/\x15\xF1\x11\x1C` ``\x83\x01Q\x01R\x7F\x11\xD4\xCE\xB1Ya\xD1\x0BaV\xAE=\t\xBBx\xB4\xDFE\xFB\x85C\x06\x08\x84\xE7\xD4\0u[\xEBJ\xC8`\x80\x82\x01QR\x7F\x03&\xFF\x069\x1E\xD5\xD2n\xC1\xBC\x08\x0B\x8DF\x01N\xE2,\x0Ch\xED\x02/\x16 \xC4\xD9\xD3\x847\xD3` `\x80\x83\x01Q\x01R\x7F#a\x0C\xB4>!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a!\xC8\x82a#+V[a!\xEB\x83`\0\x81Q\x81\x10a!\xDEWa!\xDEaYQV[` \x02` \x01\x01Qa\x12\x87V[a\"\x01\x83`\x01\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"\x17\x83`\x02\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"-\x83`\x03\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"C\x83`\x04\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"Y\x83`\x05\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"o\x83`\x06\x81Q\x81\x10a!\xDEWa!\xDEaYQV[a\"\x85\x83`\x07\x81Q\x81\x10a!\xDEWa!\xDEaYQV[`\0a\"\x92\x85\x85\x85a$cV[\x90Pa\"\x9D\x81a%\xADV[\x91PP[\x93\x92PPPV[a\"\xB1\x82a*\x0CV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\"\xF6Wa\x17\xAE\x82\x82a*hV[a\x08la*\xDEV[a#\x06a*\xFDV[a\rOW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x12\x1Fa\"\xFEV[\x80Qa#6\x90a+\x17V[a#C\x81` \x01Qa+\x17V[a#P\x81`@\x01Qa+\x17V[a#]\x81``\x01Qa+\x17V[a#j\x81`\x80\x01Qa+\x17V[a#w\x81`\xA0\x01Qa+\x17V[a#\x84\x81`\xC0\x01Qa+\x17V[a#\x91\x81`\xE0\x01Qa+\x17V[a#\x9F\x81a\x01\0\x01Qa+\x17V[a#\xAD\x81a\x01 \x01Qa+\x17V[a#\xBB\x81a\x01@\x01Qa+\x17V[a#\xC9\x81a\x01`\x01Qa+\x17V[a#\xD7\x81a\x01\x80\x01Qa+\x17V[a#\xE5\x81a\x01\xA0\x01Qa\x12\x87V[a#\xF3\x81a\x01\xC0\x01Qa\x12\x87V[a$\x01\x81a\x01\xE0\x01Qa\x12\x87V[a$\x0F\x81a\x02\0\x01Qa\x12\x87V[a$\x1D\x81a\x02 \x01Qa\x12\x87V[a$+\x81a\x02@\x01Qa\x12\x87V[a$9\x81a\x02`\x01Qa\x12\x87V[a$G\x81a\x02\x80\x01Qa\x12\x87V[a$U\x81a\x02\xA0\x01Qa\x12\x87V[a\x12R\x81a\x02\xC0\x01Qa\x12\x87V[a$kaQvV[\x83` \x01Q\x83Q\x14a$\x90W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a$\x9D\x85\x85\x85a+\xA5V[\x90P`\0a$\xAE\x86`\0\x01Qa.\xC4V[\x90P`\0a$\xC1\x82\x84`\xA0\x01Q\x88a2\x8FV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a%\x0CaQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x04W\x90PP\x90P`\0a%1\x8A\x85\x8A\x89\x87\x87a2\xEFV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` a]\xBC\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` a]\xBC\x839\x81Q\x91Ra%\xC6aQ\xB0V[a%\xCEaQ\xB0V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a&\x10aQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x08W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a&?Wa&?aYQV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&cWa&caYQV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&\x86Wa&\x86aYQV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&\xAAWa&\xAAaYQV[` \x02` \x01\x01\x81\x90RPa&\xBF\x82\x84a3$V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\xDE\x82`\x02aY\xCAV[a&\xE9\x90`\x01aY\xCAV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\x03Wa'\x03aRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a',W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'GWa'GaRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'\x80W\x81` \x01[a'maQ\xB0V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a'eW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a($W\x89`\x80\x01Q\x81\x81Q\x81\x10a'\xAEWa'\xAEaYQV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'\xC8Wa'\xC8aYQV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\xEAWa'\xEAaYQV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a(\x04Wa(\x04aYQV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x1A`\x01\x83aY\xCAV[\x91P`\x01\x01a'\x8BV[P\x88` \x01Q\x84\x82\x81Q\x81\x10a(a*\xC5V[``\x91P[P\x91P\x91Pa*\xD5\x85\x83\x83a6\x86V[\x95\x94PPPPPV[4\x15a\rOW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a+\x07a\x18|V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` a]<\x839\x81Q\x91Ra+1\x83a6\xD9V[\x15a+;WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x17\xAEW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\t\xDAV[a+\xED`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` a]\xBC\x839\x81Q\x91Ra,\x1C\x82\x87\x87a6\xE8V[\x81Q\x84Qa,)\x90a:\x81V[a,6\x86` \x01Qa:\x81V[a,C\x87`@\x01Qa:\x81V[a,P\x88``\x01Qa:\x81V[a,]\x89`\x80\x01Qa:\x81V[`@Q` \x01a,r\x96\x95\x94\x93\x92\x91\x90aY\xF9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\x8D\x82a:\xF6V[Pa,\x97\x82a:\xF6V[``\x84\x01Ra,\xA5\x82a:\xF6V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\xBA\x90a:\x81V[`@Q` \x01a,\xCB\x92\x91\x90aZxV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xE6\x82a:\xF6V[\x83R\x81Q`\xC0\x85\x01Qa,\xF8\x90a:\x81V[a-\x05\x86`\xE0\x01Qa:\x81V[a-\x13\x87a\x01\0\x01Qa:\x81V[a-!\x88a\x01 \x01Qa:\x81V[a-/\x89a\x01@\x01Qa:\x81V[`@Q` \x01a-D\x96\x95\x94\x93\x92\x91\x90aY\xF9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-_\x82a:\xF6V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa-u\x90a;XV[a-\x83\x86a\x01\xC0\x01Qa;XV[a-\x91\x87a\x01\xE0\x01Qa;XV[a-\x9F\x88a\x02\0\x01Qa;XV[a-\xAD\x89a\x02 \x01Qa;XV[`@Q` \x01a-\xC2\x96\x95\x94\x93\x92\x91\x90aZ\xA7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-\xE4\x90a;XV[a-\xF2\x86a\x02`\x01Qa;XV[a.\0\x87a\x02\x80\x01Qa;XV[a.\x0E\x88a\x02\xA0\x01Qa;XV[a.\x1C\x89a\x02\xC0\x01Qa;XV[`@Q` \x01a.1\x96\x95\x94\x93\x92\x91\x90aZ\xA7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.L\x82a:\xF6V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa.b\x90a:\x81V[a.p\x86a\x01\x80\x01Qa:\x81V[`@Q` \x01a.\x82\x93\x92\x91\x90aZ\xE3V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\x9D\x82a:\xF6V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.\xF6`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a/\x8AWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a0\x1FWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\xB4WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a1IWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a1\xDEWP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a2qWP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\xB3`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2\xBD\x84\x84a<\x8FV[\x80\x82Ra2\xCD\x90\x85\x90\x85\x90a<\xE3V[` \x82\x01R\x80Qa2\xE3\x90\x85\x90\x84\x90\x86\x90a=WV[`@\x82\x01R\x93\x92PPPV[`\0\x80a2\xFD\x85\x87\x89a?\x0BV[\x90Pa3\r\x88\x86\x89\x89\x88\x88a?\xF7V[a3\x18\x81\x87\x86aC\x03V[\x98\x97PPPPPPPPV[a3,aQ\xB0V[\x82Q\x82Q\x14a3}W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\t\xDAV[a3\xBB\x83`\0\x81Q\x81\x10a3\x93Wa3\x93aYQV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3\xAEWa3\xAEaYQV[` \x02` \x01\x01QaCSV[\x90P`\x01[\x82Q\x81\x10\x15a4\x0BWa4\x01\x82a3\xFC\x86\x84\x81Q\x81\x10a3\xE2Wa3\xE2aYQV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3\xAEWa3\xAEaYQV[aC\xE7V[\x91P`\x01\x01a3\xC0V[P\x92\x91PPV[`\0a4,`\0\x80Q` a]\xBC\x839\x81Q\x91R\x83a[\x0EWa>\x0EaRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a>|W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>GV[Pa>\x86\x83aE\xB8V[\x92P`\0[\x88\x81\x10\x15a>\xF9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a>\xD8W\x80\x82\x14a>\xD0W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a>\xAEV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a>\x8BV[PPPPPPPPPP\x94\x93PPPPV[`\0\x80`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x85\x85\x01\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\x05\x86\x86\x86\x86\x85\x87aG#V[`\xC0\x85\x01Q\x82Q`\0\x80Q` a]\xBC\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a@4Wa@4aYQV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a@XWa@XaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a@}Wa@}aYQV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a@\xA1Wa@\xA1aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a@\xC6Wa@\xC6aYQV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a@\xEAWa@\xEAaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\x0FWaA\x0FaYQV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aA3WaA3aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aAXWaAXaYQV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aA|WaA|aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aA\xA1WaA\xA1aYQV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aA\xC5WaA\xC5aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aA\xEAWaA\xEAaYQV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\x0EWaB\x0EaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aB3WaB3aYQV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aBWWaBWaYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aB|WaB|aYQV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aB\xA0WaB\xA0aYQV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aB\xC9WaB\xC9aYQV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aB\xEDWaB\xEDaYQV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` a]\xBC\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aCJW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aC\x19V[PP\x93\x92PPPV[aC[aQ\xB0V[aCcaQ\xCAV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aC\x95W`\0\x80\xFD[P\x80aC\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\t\xDAV[PP\x92\x91PPV[aC\xEFaQ\xB0V[aC\xF7aQ\xE8V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aD4W`\0\x80\xFD[P\x80aC\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\t\xDAV[\x80Q\x15aD\x92W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aD\xB9\x81`\x1FaY\xCAV[\x10\x15aD\xF8W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\t\xDAV[aE\x02\x82\x84aY\xCAV[\x84Q\x10\x15aEFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\t\xDAV[``\x82\x15\x80\x15aEeW`@Q\x91P`\0\x82R` \x82\x01`@RaE\xAFV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aE\x9EW\x80Q\x83R` \x92\x83\x01\x92\x01aE\x86V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aFWW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\t\xDAV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aF\x85W`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` a]\xBC\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aF\xB3WaF\xB3aRsV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aF\xDCW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a<\xDAW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aG\x18W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaF\xFCV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` a]\xBC\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\\\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a]\xFC\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^<\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a]|\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aHRWaHRaYQV[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aHqWaHqaYQV[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aISWaISaYQV[` \x90\x81\x02\x91\x90\x91\x01\x01RaIh\x85\x82aYgV[\x87`\x01\x81Q\x81\x10aI{WaI{aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aI\xA0WaI\xA0aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aI\xC5WaI\xC5aYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aI\xEAWaI\xEAaYQV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aJ\x0FWaJ\x0FaYQV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aJ3WaJ3aYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aJWWaJWaYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aJ{WaJ{aYQV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aJ\x9FWaJ\x9FaYQV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aJ\xCEWaJ\xCEaYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aJ\xF3WaJ\xF3aYQV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aK\"WaK\"aYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aKGWaKGaYQV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aK\x80WaK\x80aYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aK\xA5WaK\xA5aYQV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aK\xDEWaK\xDEaYQV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aL\x03WaL\x03aYQV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aL v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([84, 100, 96, 133], ())
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getHotShotCommitment` (0x8584d23f) function
+ pub fn get_hot_shot_commitment(
+ &self,
+ hot_shot_block_height: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([133, 132, 210, 63], hot_shot_block_height)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getStateUpdateBlockNumbersCount` (0x7053fc51) function
+ pub fn get_state_update_block_numbers_count(
+ &self,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([112, 83, 252, 81], ())
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `getVersion` (0x0d8e6e2c) function
pub fn get_version(&self) -> ::ethers::contract::builders::ContractCall {
self.0
.method_hash([13, 142, 110, 44], ())
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `hotShotCommitments` (0xdb13b60a) function
+ pub fn hot_shot_commitments(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall
+ {
+ self.0
+ .method_hash([219, 19, 182, 10], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `initialize` (0xa244d596) function
pub fn initialize(
&self,
@@ -1159,6 +1398,16 @@ pub mod light_client_mock {
.method_hash([162, 68, 213, 150], (genesis, num_blocks_per_epoch, owner))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function
+ pub fn lag_over_escape_hatch_threshold(
+ &self,
+ block_number: ::ethers::core::types::U256,
+ threshold: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([224, 48, 51, 1], (block_number, threshold))
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `newFinalizedState` (0x409939b7) function
pub fn new_finalized_state(
&self,
@@ -1223,6 +1472,15 @@ pub mod light_client_mock {
.method_hash([32, 42, 10, 219], (state,))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `setHotShotCommitments` (0x530ca78f) function
+ pub fn set_hot_shot_commitments(
+ &self,
+ values: ::std::vec::Vec,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([83, 12, 167, 143], values)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `setPermissionedProver` (0x013fa5fc) function
pub fn set_permissioned_prover(
&self,
@@ -1232,6 +1490,24 @@ pub mod light_client_mock {
.method_hash([1, 63, 165, 252], prover)
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `setStateUpdateBlockNumbers` (0x3919340f) function
+ pub fn set_state_update_block_numbers(
+ &self,
+ values: ::std::vec::Vec<::ethers::core::types::U256>,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([57, 25, 52, 15], values)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `stateUpdateBlockNumbers` (0xa51e6fea) function
+ pub fn state_update_block_numbers(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([165, 30, 111, 234], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `states` (0x7f17baad) function
pub fn states(
&self,
@@ -1430,6 +1706,24 @@ pub mod light_client_mock {
)]
#[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")]
pub struct FailedInnerCall;
+ ///Custom Error type `InsufficientSnapshotHistory` with signature `InsufficientSnapshotHistory()` and selector `0xb0b43877`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InsufficientSnapshotHistory",
+ abi = "InsufficientSnapshotHistory()"
+ )]
+ pub struct InsufficientSnapshotHistory;
///Custom Error type `InvalidAddress` with signature `InvalidAddress()` and selector `0xe6c4247b`
#[derive(
Clone,
@@ -1460,6 +1754,24 @@ pub mod light_client_mock {
)]
#[etherror(name = "InvalidArgs", abi = "InvalidArgs()")]
pub struct InvalidArgs;
+ ///Custom Error type `InvalidHotShotBlockForCommitmentCheck` with signature `InvalidHotShotBlockForCommitmentCheck()` and selector `0x615a9264`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InvalidHotShotBlockForCommitmentCheck",
+ abi = "InvalidHotShotBlockForCommitmentCheck()"
+ )]
+ pub struct InvalidHotShotBlockForCommitmentCheck;
///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9`
#[derive(
Clone,
@@ -1736,8 +2048,10 @@ pub mod light_client_mock {
ERC1967InvalidImplementation(ERC1967InvalidImplementation),
ERC1967NonPayable(ERC1967NonPayable),
FailedInnerCall(FailedInnerCall),
+ InsufficientSnapshotHistory(InsufficientSnapshotHistory),
InvalidAddress(InvalidAddress),
InvalidArgs(InvalidArgs),
+ InvalidHotShotBlockForCommitmentCheck(InvalidHotShotBlockForCommitmentCheck),
InvalidInitialization(InvalidInitialization),
InvalidPolyEvalArgs(InvalidPolyEvalArgs),
InvalidProof(InvalidProof),
@@ -1784,12 +2098,24 @@ pub mod light_client_mock {
if let Ok(decoded) = ::decode(data) {
return Ok(Self::FailedInnerCall(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::InsufficientSnapshotHistory(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidAddress(decoded));
}
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidArgs(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::InvalidHotShotBlockForCommitmentCheck(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -1872,8 +2198,14 @@ pub mod light_client_mock {
}
Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InsufficientSnapshotHistory(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidAddress(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::InvalidArgs(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidInitialization(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
@@ -1934,12 +2266,20 @@ pub mod light_client_mock {
== ::selector() => {
true
}
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
}
_ if selector
== ::selector() => true,
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
@@ -2013,8 +2353,12 @@ pub mod light_client_mock {
}
Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f),
Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InsufficientSnapshotHistory(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidAddress(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidArgs(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidPolyEvalArgs(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f),
@@ -2064,6 +2408,11 @@ pub mod light_client_mock {
Self::FailedInnerCall(value)
}
}
+ impl ::core::convert::From for LightClientMockErrors {
+ fn from(value: InsufficientSnapshotHistory) -> Self {
+ Self::InsufficientSnapshotHistory(value)
+ }
+ }
impl ::core::convert::From for LightClientMockErrors {
fn from(value: InvalidAddress) -> Self {
Self::InvalidAddress(value)
@@ -2074,6 +2423,11 @@ pub mod light_client_mock {
Self::InvalidArgs(value)
}
}
+ impl ::core::convert::From for LightClientMockErrors {
+ fn from(value: InvalidHotShotBlockForCommitmentCheck) -> Self {
+ Self::InvalidHotShotBlockForCommitmentCheck(value)
+ }
+ }
impl ::core::convert::From for LightClientMockErrors {
fn from(value: InvalidInitialization) -> Self {
Self::InvalidInitialization(value)
@@ -2558,6 +2912,59 @@ pub mod light_client_mock {
)]
#[ethcall(name = "getGenesisState", abi = "getGenesisState()")]
pub struct GetGenesisStateCall;
+ ///Container type for all input parameters for the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getHotShotBlockCommitmentsCount",
+ abi = "getHotShotBlockCommitmentsCount()"
+ )]
+ pub struct GetHotShotBlockCommitmentsCountCall;
+ ///Container type for all input parameters for the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "getHotShotCommitment", abi = "getHotShotCommitment(uint256)")]
+ pub struct GetHotShotCommitmentCall {
+ pub hot_shot_block_height: ::ethers::core::types::U256,
+ }
+ ///Container type for all input parameters for the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getStateUpdateBlockNumbersCount",
+ abi = "getStateUpdateBlockNumbersCount()"
+ )]
+ pub struct GetStateUpdateBlockNumbersCountCall;
///Container type for all input parameters for the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -2573,6 +2980,21 @@ pub mod light_client_mock {
)]
#[ethcall(name = "getVersion", abi = "getVersion()")]
pub struct GetVersionCall;
+ ///Container type for all input parameters for the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "hotShotCommitments", abi = "hotShotCommitments(uint256)")]
+ pub struct HotShotCommitmentsCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)` and selector `0xa244d596`
#[derive(
Clone,
@@ -2595,6 +3017,27 @@ pub mod light_client_mock {
pub num_blocks_per_epoch: u32,
pub owner: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "lagOverEscapeHatchThreshold",
+ abi = "lagOverEscapeHatchThreshold(uint256,uint256)"
+ )]
+ pub struct LagOverEscapeHatchThresholdCall {
+ pub block_number: ::ethers::core::types::U256,
+ pub threshold: ::ethers::core::types::U256,
+ }
///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x409939b7`
#[derive(
Clone,
@@ -2726,6 +3169,26 @@ pub mod light_client_mock {
pub struct SetFinalizedStateCall {
pub state: LightClientState,
}
+ ///Container type for all input parameters for the `setHotShotCommitments` function with signature `setHotShotCommitments((uint64,uint256)[])` and selector `0x530ca78f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "setHotShotCommitments",
+ abi = "setHotShotCommitments((uint64,uint256)[])"
+ )]
+ pub struct SetHotShotCommitmentsCall {
+ pub values: ::std::vec::Vec,
+ }
///Container type for all input parameters for the `setPermissionedProver` function with signature `setPermissionedProver(address)` and selector `0x013fa5fc`
#[derive(
Clone,
@@ -2743,6 +3206,44 @@ pub mod light_client_mock {
pub struct SetPermissionedProverCall {
pub prover: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `setStateUpdateBlockNumbers` function with signature `setStateUpdateBlockNumbers(uint256[])` and selector `0x3919340f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "setStateUpdateBlockNumbers",
+ abi = "setStateUpdateBlockNumbers(uint256[])"
+ )]
+ pub struct SetStateUpdateBlockNumbersCall {
+ pub values: ::std::vec::Vec<::ethers::core::types::U256>,
+ }
+ ///Container type for all input parameters for the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "stateUpdateBlockNumbers",
+ abi = "stateUpdateBlockNumbers(uint256)"
+ )]
+ pub struct StateUpdateBlockNumbersCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
@@ -2840,8 +3341,13 @@ pub mod light_client_mock {
FrozenThreshold(FrozenThresholdCall),
GetFinalizedState(GetFinalizedStateCall),
GetGenesisState(GetGenesisStateCall),
+ GetHotShotBlockCommitmentsCount(GetHotShotBlockCommitmentsCountCall),
+ GetHotShotCommitment(GetHotShotCommitmentCall),
+ GetStateUpdateBlockNumbersCount(GetStateUpdateBlockNumbersCountCall),
GetVersion(GetVersionCall),
+ HotShotCommitments(HotShotCommitmentsCall),
Initialize(InitializeCall),
+ LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall),
NewFinalizedState(NewFinalizedStateCall),
Owner(OwnerCall),
PermissionedProver(PermissionedProverCall),
@@ -2850,7 +3356,10 @@ pub mod light_client_mock {
RenounceOwnership(RenounceOwnershipCall),
SetCurrentEpoch(SetCurrentEpochCall),
SetFinalizedState(SetFinalizedStateCall),
+ SetHotShotCommitments(SetHotShotCommitmentsCall),
SetPermissionedProver(SetPermissionedProverCall),
+ SetStateUpdateBlockNumbers(SetStateUpdateBlockNumbersCall),
+ StateUpdateBlockNumbers(StateUpdateBlockNumbersCall),
States(StatesCall),
TransferOwnership(TransferOwnershipCall),
UpgradeToAndCall(UpgradeToAndCallCall),
@@ -2906,12 +3415,41 @@ pub mod light_client_mock {
{
return Ok(Self::GetGenesisState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetHotShotBlockCommitmentsCount(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::GetHotShotCommitment(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetStateUpdateBlockNumbersCount(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::GetVersion(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::HotShotCommitments(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::Initialize(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::LagOverEscapeHatchThreshold(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -2949,11 +3487,26 @@ pub mod light_client_mock {
{
return Ok(Self::SetFinalizedState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::SetHotShotCommitments(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
return Ok(Self::SetPermissionedProver(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::SetStateUpdateBlockNumbers(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::StateUpdateBlockNumbers(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::States(decoded));
}
@@ -3000,8 +3553,23 @@ pub mod light_client_mock {
Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetHotShotCommitment(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::HotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::LagOverEscapeHatchThreshold(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::NewFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::PermissionedProver(element) => {
@@ -3014,9 +3582,18 @@ pub mod light_client_mock {
Self::RenounceOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::SetCurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::SetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::SetHotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::SetPermissionedProver(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
+ Self::SetStateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::StateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::States(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
@@ -3041,8 +3618,17 @@ pub mod light_client_mock {
Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
+ Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f),
+ Self::HotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
Self::Initialize(element) => ::core::fmt::Display::fmt(element, f),
+ Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::Owner(element) => ::core::fmt::Display::fmt(element, f),
Self::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
@@ -3051,7 +3637,10 @@ pub mod light_client_mock {
Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::SetCurrentEpoch(element) => ::core::fmt::Display::fmt(element, f),
Self::SetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetHotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
Self::SetPermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetStateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
+ Self::StateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
Self::States(element) => ::core::fmt::Display::fmt(element, f),
Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f),
@@ -3105,16 +3694,41 @@ pub mod light_client_mock {
Self::GetGenesisState(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetHotShotBlockCommitmentsCountCall) -> Self {
+ Self::GetHotShotBlockCommitmentsCount(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetHotShotCommitmentCall) -> Self {
+ Self::GetHotShotCommitment(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetStateUpdateBlockNumbersCountCall) -> Self {
+ Self::GetStateUpdateBlockNumbersCount(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: GetVersionCall) -> Self {
Self::GetVersion(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: HotShotCommitmentsCall) -> Self {
+ Self::HotShotCommitments(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: InitializeCall) -> Self {
Self::Initialize(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: LagOverEscapeHatchThresholdCall) -> Self {
+ Self::LagOverEscapeHatchThreshold(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: NewFinalizedStateCall) -> Self {
Self::NewFinalizedState(value)
@@ -3155,11 +3769,26 @@ pub mod light_client_mock {
Self::SetFinalizedState(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetHotShotCommitmentsCall) -> Self {
+ Self::SetHotShotCommitments(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: SetPermissionedProverCall) -> Self {
Self::SetPermissionedProver(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetStateUpdateBlockNumbersCall) -> Self {
+ Self::SetStateUpdateBlockNumbers(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: StateUpdateBlockNumbersCall) -> Self {
+ Self::StateUpdateBlockNumbers(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: StatesCall) -> Self {
Self::States(value)
@@ -3297,6 +3926,48 @@ pub mod light_client_mock {
Hash,
)]
pub struct GetGenesisStateReturn(pub LightClientState);
+ ///Container type for all return fields from the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotBlockCommitmentsCountReturn(pub ::ethers::core::types::U256);
+ ///Container type for all return fields from the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotCommitmentReturn(pub HotShotCommitment);
+ ///Container type for all return fields from the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetStateUpdateBlockNumbersCountReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -3315,6 +3986,37 @@ pub mod light_client_mock {
pub minor_version: u8,
pub patch_version: u8,
}
+ ///Container type for all return fields from the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct HotShotCommitmentsReturn {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+ }
+ ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct LagOverEscapeHatchThresholdReturn(pub bool);
///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b`
#[derive(
Clone,
@@ -3371,6 +4073,20 @@ pub mod light_client_mock {
Hash,
)]
pub struct ProxiableUUIDReturn(pub [u8; 32]);
+ ///Container type for all return fields from the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct StateUpdateBlockNumbersReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs
index 18211d22a..0176246d0 100644
--- a/contract-bindings/src/shared_types.rs
+++ b/contract-bindings/src/shared_types.rs
@@ -53,6 +53,23 @@ pub struct PlonkProof {
pub sigma_eval_3: ::ethers::core::types::U256,
pub prod_perm_zeta_omega_eval: ::ethers::core::types::U256,
}
+///`HotShotCommitment(uint64,uint256)`
+#[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+)]
+pub struct HotShotCommitment {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+}
///`LightClientState(uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256)`
#[derive(
Clone,
diff --git a/contracts/.gitignore b/contracts/.gitignore
index 5c4627912..b68c24227 100644
--- a/contracts/.gitignore
+++ b/contracts/.gitignore
@@ -13,3 +13,10 @@ out/
# Dotenv file
.env
+
+.wake
+pytypes
+__pycache__/
+*.py[cod]
+.hypothesis/
+wake-coverage.cov
\ No newline at end of file
diff --git a/contracts/rust/adapter/Cargo.toml b/contracts/rust/adapter/Cargo.toml
index 3072bfc8a..d242940fc 100644
--- a/contracts/rust/adapter/Cargo.toml
+++ b/contracts/rust/adapter/Cargo.toml
@@ -18,8 +18,8 @@ contract-bindings = { path = "../../../contract-bindings" }
diff-test-bn254 = { git = "https://github.com/EspressoSystems/solidity-bn254.git" }
ethers = { version = "2.0.4" }
hotshot-types = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-utils = { workspace = true }
num-bigint = { version = "0.4", default-features = false }
num-traits = { version = "0.2", default-features = false }
diff --git a/contracts/rust/adapter/src/jellyfish.rs b/contracts/rust/adapter/src/jellyfish.rs
index 18943d847..1df5a92ab 100644
--- a/contracts/rust/adapter/src/jellyfish.rs
+++ b/contracts/rust/adapter/src/jellyfish.rs
@@ -11,10 +11,10 @@ use ethers::{
prelude::{AbiError, EthAbiCodec, EthAbiType},
types::{Bytes, H256, U256},
};
+use jf_pcs::prelude::Commitment;
use jf_plonk::proof_system::structs::{OpenKey, Proof, ProofEvaluations, VerifyingKey};
use jf_plonk::testing_apis::Challenges;
use jf_plonk::{constants::KECCAK256_STATE_SIZE, transcript::SolidityTranscript};
-use jf_primitives::pcs::prelude::Commitment;
use num_bigint::BigUint;
use num_traits::Num;
diff --git a/contracts/rust/diff-test/Cargo.toml b/contracts/rust/diff-test/Cargo.toml
index 59fdae91a..6669efe59 100644
--- a/contracts/rust/diff-test/Cargo.toml
+++ b/contracts/rust/diff-test/Cargo.toml
@@ -23,9 +23,10 @@ hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../../../hotshot-state-prover" }
hotshot-types = { workspace = true }
itertools = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-relation = { workspace = true }
+jf-signature = { workspace = true }
jf-utils = { workspace = true }
sha3 = { version = "0.10.8", default-features = false }
diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs
index b7dc3976d..5c7b58b40 100644
--- a/contracts/rust/diff-test/src/main.rs
+++ b/contracts/rust/diff-test/src/main.rs
@@ -17,17 +17,16 @@ use hotshot_state_prover::mock_ledger::{
gen_plonk_proof_for_test, MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY,
};
use itertools::multiunzip;
+use jf_pcs::prelude::Commitment;
use jf_plonk::proof_system::structs::{Proof, VerifyingKey};
use jf_plonk::proof_system::PlonkKzgSnark;
use jf_plonk::{
testing_apis::Verifier,
transcript::{PlonkTranscript, SolidityTranscript},
};
-use jf_primitives::constants::CS_ID_BLS_BN254;
-use jf_primitives::pcs::prelude::Commitment;
-use jf_primitives::signatures::bls_over_bn254::Signature;
-use jf_primitives::signatures::bls_over_bn254::{hash_to_curve, KeyPair as BLSKeyPair};
-use jf_primitives::signatures::schnorr::KeyPair as SchnorrKeyPair;
+use jf_signature::bls_over_bn254::{hash_to_curve, KeyPair as BLSKeyPair, Signature};
+use jf_signature::constants::CS_ID_BLS_BN254;
+use jf_signature::schnorr::KeyPair as SchnorrKeyPair;
use sha3::Keccak256;
#[derive(Parser)]
diff --git a/contracts/rust/gen-vk-contract/Cargo.toml b/contracts/rust/gen-vk-contract/Cargo.toml
index 595c163d0..dc4920fc7 100644
--- a/contracts/rust/gen-vk-contract/Cargo.toml
+++ b/contracts/rust/gen-vk-contract/Cargo.toml
@@ -10,4 +10,4 @@ ark-srs = { workspace = true }
hotshot-contract-adapter = { path = "../adapter" }
hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../../../hotshot-state-prover" }
-jf-primitives = { workspace = true }
+jf-pcs = { workspace = true }
diff --git a/contracts/rust/gen-vk-contract/src/main.rs b/contracts/rust/gen-vk-contract/src/main.rs
index ce32050aa..d6804eca7 100644
--- a/contracts/rust/gen-vk-contract/src/main.rs
+++ b/contracts/rust/gen-vk-contract/src/main.rs
@@ -9,7 +9,7 @@ use std::process::Command;
use hotshot_contract_adapter::jellyfish::ParsedVerifyingKey;
use hotshot_stake_table::config::STAKE_TABLE_CAPACITY;
-use jf_primitives::pcs::prelude::UnivariateUniversalParams;
+use jf_pcs::prelude::UnivariateUniversalParams;
fn main() {
let srs = {
diff --git a/contracts/script/README.md b/contracts/script/README.md
index 573f613b2..6ddf07f41 100644
--- a/contracts/script/README.md
+++ b/contracts/script/README.md
@@ -18,10 +18,19 @@ settings.
1. Create a multisig wallet using [Safe](https://app.safe.global/welcome/accounts) on the network you'd like to deploy
to.
-2. In OpenZeppelin Defender, create an Approval Process that requires the multisig wallet you created above.
- `Manage > Approval Processes`
-3. In OpenZeppelin Defender, create a deployment environment and use the approval process created in Step 2. Be sure to
- copy the Defender secret and key, that is shown at the end of this step, into the .env file.
+2. In [OpenZeppelin Defender](https://www.openzeppelin.com/defender), create an Approval Process that requires the
+ multisig wallet you created above. `Manage > Approval Processes`.
+ 1. Enter a name for your approval process
+ 1. Enter the multisig address from shown in te Safe UI
+ 1. Enter one of multisig owner address addresses
+ 1. Save the changes
+3. In OpenZeppelin Defender, create a deployment environment by clicking on "Setup" in the
+ [deploy](https://defender.openzeppelin.com/v2/#/deploy) tab. Use "Test Environment" for deploying to testnets (e. g.
+ Sepolia) and "Production Environment" for mainnet.
+ 1. Choose a network
+ 1. Select the approval process created in Step 2
+ 1. Be sure to save DEFENDER_SECRET ("Team Secret key") and DEFENDER_KEY ("Team API Key"), that is shown at the end of
+ this step, into the .env file. The keys won't be available later at a later point.
## Deployments
@@ -29,15 +38,23 @@ settings.
Steps:
-1. Run the Deployment Command This command requires you to go to OpenZeppelin Defender's UI to see the transaction.
- Click that transaction which opens up the Safe UI where your signers for that Safe multi-sig wallet can confirm the
- transaction. The two transactions to be confirmed are: (i) deployment of implementation contract (ii) deployment of
- proxy contract
+1. Run the Deployment command.
-```bash
-forge clean && \
-forge script contracts/script/FeeContractWithDefender.s.sol:FeeContractDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
-```
+ ```bash
+ forge clean && forge script contracts/script/FeeContractWithDefender.s.sol:FeeContractDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
+ ```
+
+ 1. Go to the [deploy](https://defender.openzeppelin.com/v2/#/deploy) tab OpenZeppelin Defender's UI and click on the
+ current environment to see the transaction. The transaction should be visible with status "SUBMITTED". The page
+ may need to be refreshed a few times. It occasionally may take minutes for transactions to appear.
+ 2. Click that transaction, then "Open in Safe App" which opens up the Safe UI where your signers for that Safe
+ multi-sig wallet can confirm the transaction. The two transactions to be confirmed are: (i) deployment of
+ implementation contract (ii) deployment of proxy contract
+ 3. If the transaction looks correct click "confirm".
+ 4. Click "Execute".
+ 5. Confirm the transaction with your wallet (e. g. metamask).
+ 6. Repeat steps 1 to 5 for the deployment of the proxy contract. You may need to refresh the OpenZeppelin Defender
+ "deploy" tab a few times until the second transaction appears.
2. Verify the Implementation contract on Etherscan (Use another window as step would not have completed yet)
@@ -73,10 +90,11 @@ Read Deploying the Fee Contract for a more detailed version of this.
1. Initiate the Deployment with OpenZeppelin Defender
```bash
-forge clean && \
-forge script contracts/script/LightClientWithDefender.s.sol:LightClientDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
+forge clean && forge script contracts/script/LightClientWithDefender.s.sol:LightClientDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
```
+Follow the same steps as for the deployment of the fee contract above.
+
2. Verify the Contract
```bash
diff --git a/contracts/script/multisigTransactionProposals/README.md b/contracts/script/multisigTransactionProposals/README.md
new file mode 100644
index 000000000..080873ee3
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/README.md
@@ -0,0 +1,92 @@
+# Proposing Multisig Transactions via the Safe SDK
+
+The [Safe SDK](https://github.com/safe-global/safe-core-sdk/blob/main/guides/integrating-the-safe-core-sdk.md) is being
+used to propose transactions that only the Safe multisig admin wallet can perform. The proposer of these transactions is
+also part of the multisig wallet but is used to orchestrate the process. E.g. If you require 3 of 5 trusted signers to
+sign a transaction, then the multisig wallet should require 4 of 5 signers where the 4th signer is the orchestrator
+wallet.
+
+## Set Permissioned Prover
+
+To enable the permissioned prover on the light client contract, ensure that the following environment variables are set
+in the `.env` file:
+
+- `SEPOLIA_RPC_URL`
+- `SAFE_ORCHESTRATOR_PRIVATE_KEY`
+- `SAFE_MULTISIG_ADDRESS`
+- `APPROVED_PROVER_ADDRESS`
+- `LIGHT_CLIENT_CONTRACT_ADDRESS`
+
+Assuming you're in the root folder, run the following command:
+
+```bash
+ts-node contracts/script/multisigTransactionProposals/safeSDK/setProverProposal.ts
+```
+
+Open the the URL shown in the console to sign the transaction in the Safe UI.
+
+Once successful, all signers will see a transaction request on the SAFE UI e.g.
+`https://app.safe.global/transactions/queue?safe=$SAFE_MULTISIG_ADDRESS`
+
+Once the transaction has been signed by all signers and executed by one, you should be able to go to the light client
+proxy and read the permissioned prover address on etherscan.
+
+## Disable Permissioned Prover
+
+To disable the permissioned prover on the light client contract, ensure that the following environment variables are set
+in the `.env` file:
+
+- `SEPOLIA_RPC_URL`
+- `SAFE_ORCHESTRATOR_PRIVATE_KEY`
+- `SAFE_MULTISIG_ADDRESS`
+- `LIGHT_CLIENT_CONTRACT_ADDRESS`
+
+Assuming you're in the root folder, run the following command:
+
+```bash
+ts-node contracts/script/multisigTransactionProposals/safeSDK/disableProverProposal.ts
+```
+
+Once successful, all signers will see a transaction request on the SAFE UI
+`https://app.safe.global/transactions/queue?safe=$SAFE_MULTISIG_ADDRESS`
+
+Once the transaction has been signed by all signers and executed by one, you should be able to go to the light client
+proxy and read the permissioned prover address. It will be equal to the 0 ETH address (address(0)).
+
+## Demonstrating the setPermissionedProver workflow
+
+1. Follow the steps in the deployment script [readme](../../contracts/script/README.md) to set up OpenZeppelin Defender,
+ a Multisig Wallet and deploy the Light Client contract
+2. Set the environment variables mentioned in the section, [Set Permissioned Prover](#set-permissioned-prover)
+3. Run the `ts-node` command as mentioned in the section, [Set Permissioned Prover](#set-permissioned-prover)
+
+## Demonstrating the disablePermissionedProver workflow
+
+1. Follow the steps in the deployment script [readme](../../contracts/script/README.md) to set up OpenZeppelin Defender,
+ a Multisig Wallet and deploy the Light Client contract
+2. Set the environment variables mentioned in the section, [Disable Permissioned Prover](#disable-permissioned-prover)
+3. Run the `ts-node` command as mentioned in the section, [Disable Permissioned Prover](#disable-permissioned-prover)
+
+## Testing
+
+### Testing Safe Multisig Wallets
+
+The Safe Transaction Service requires a live network available for testing and the current service only supports mainnet
+and testnets such as Sepolia. The Safe Wallet UI only works with public networks that they support and to customize it
+for a private EVM network, read their [docs](https://help.safe.global/en/articles/40795-supported-networks) for more
+info. It's non-trivial to set up Safe for private networks and therefore time has not been allocated to do so at this
+stage.
+
+### Testing the utils
+
+Testing safeSDK/utils.ts
+
+```bash
+yarn jest contracts/script/multisigTransactionProposals/tests/utils.test.ts
+```
+
+OR
+
+```bash
+yarn jest
+```
diff --git a/contracts/script/multisigTransactionProposals/safeSDK/disableProverProposal.ts b/contracts/script/multisigTransactionProposals/safeSDK/disableProverProposal.ts
new file mode 100644
index 000000000..510bda686
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/safeSDK/disableProverProposal.ts
@@ -0,0 +1,118 @@
+import dotenv from "dotenv";
+import { ethers } from "ethers";
+import { EthersAdapter } from "@safe-global/protocol-kit";
+import SafeApiKit from "@safe-global/api-kit";
+import Safe from "@safe-global/protocol-kit";
+import { getEnvVar, createSafeTransactionData, isValidEthereumAddress } from "./utils";
+
+async function main() {
+ dotenv.config();
+
+ try {
+ /**TODO
+ * change from SEPOLIA_RPC_URL to production URL when deploying to production
+ */
+ // Initialize web3 provider using the RPC URL from environment variables
+ const web3Provider = new ethers.JsonRpcProvider(getEnvVar("SEPOLIA_RPC_URL"));
+ // Create a signer using the orchestrator's private key and the web3 provider
+ const orchestratorSigner = new ethers.Wallet(getEnvVar("SAFE_ORCHESTRATOR_PRIVATE_KEY"), web3Provider);
+
+ // Set up Eth Adapter with ethers and the signer
+ const ethAdapter = new EthersAdapter({
+ ethers,
+ signerOrProvider: orchestratorSigner,
+ });
+
+ const chainId = await ethAdapter.getChainId();
+ const safeService = new SafeApiKit({ chainId });
+
+ const safeAddress = getEnvVar("SAFE_MULTISIG_ADDRESS");
+ isValidEthereumAddress(safeAddress);
+ const safeSdk = await Safe.create({ ethAdapter, safeAddress });
+
+ await proposeDisableProverTransaction(safeSdk, safeService, await orchestratorSigner.getAddress(), safeAddress);
+
+ console.log(
+ `The other owners of the Safe Multisig wallet need to sign the transaction via the Safe UI https://app.safe.global/transactions/queue?safe=sep:${safeAddress}`,
+ );
+ } catch (error) {
+ throw new Error("An error occurred: " + error);
+ }
+}
+
+/**
+ * Function to propose the transaction data for disabling permissioned prover mode
+ * @param {Safe} safeSDK - An instance of the Safe SDK
+ * @param {SafeApiKit} safeService - An instance of the Safe Service
+ * @param {string} signerAddress - The address of the address signing the transaction
+ * @param {string} safeAddress - The address of the Safe multisig wallet
+ */
+export async function proposeDisableProverTransaction(
+ safeSDK: Safe,
+ safeService: SafeApiKit,
+ signerAddress: string,
+ safeAddress: string,
+) {
+ // Prepare the transaction data to disable permissioned prover mode
+ let data = createDisablePermissionedProverTxData();
+
+ const contractAddress = getEnvVar("LIGHT_CLIENT_CONTRACT_ADDRESS");
+ isValidEthereumAddress(contractAddress);
+
+ // Create the Safe Transaction Object
+ const safeTransaction = await createSafeTransaction(safeSDK, contractAddress, data, "0");
+
+ // Get the transaction hash and sign the transaction
+ const safeTxHash = await safeSDK.getTransactionHash(safeTransaction);
+
+ // Sign the transaction with orchestrator signer that was specified when we created the safeSDK
+ const senderSignature = await safeSDK.signHash(safeTxHash);
+
+ // Propose the transaction which can be signed by other owners via the Safe UI
+ await safeService.proposeTransaction({
+ safeAddress: safeAddress,
+ safeTransactionData: safeTransaction.data,
+ safeTxHash: safeTxHash,
+ senderAddress: signerAddress,
+ senderSignature: senderSignature.data,
+ });
+}
+
+/**
+ * Function to create the transaction data for disabling permissioned prover mode
+ * @returns {string} - Encoded transaction data
+ */
+function createDisablePermissionedProverTxData(): string {
+ // Define the ABI of the function to be called
+ const abi = ["function disablePermissionedProverMode()"];
+
+ // Encode the function call with the provided prover address
+ const data = new ethers.Interface(abi).encodeFunctionData("disablePermissionedProverMode", []);
+ return data; // Return the encoded transaction data
+}
+
+/**
+ * Creates a Safe transaction object
+ *
+ * @param {Safe} safeSDK - An instance of the Safe SDK
+ * @param {string} contractAddress - The address of the contract to interact with
+ * @param {string} data - The data payload for the transaction
+ * @param {string} value - The value to be sent with the transaction
+ * @returns {Promise} - A promise that resolves to the Safe transaction object
+ */
+async function createSafeTransaction(
+ safeSDK: Safe,
+ contractAddress: string,
+ data: string,
+ value: string,
+): Promise {
+ // Prepare the safe transaction data with the contract address, data, and value
+ let safeTransactionData = createSafeTransactionData(contractAddress, data, value);
+
+ // Create the safe transaction using the Safe SDK
+ const safeTransaction = await safeSDK.createTransaction({ transactions: [safeTransactionData] });
+
+ return safeTransaction;
+}
+
+main();
diff --git a/contracts/script/multisigTransactionProposals/safeSDK/setProverProposal.ts b/contracts/script/multisigTransactionProposals/safeSDK/setProverProposal.ts
new file mode 100644
index 000000000..328876c44
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/safeSDK/setProverProposal.ts
@@ -0,0 +1,129 @@
+import dotenv from "dotenv";
+import { ethers } from "ethers";
+import { EthersAdapter } from "@safe-global/protocol-kit";
+import SafeApiKit from "@safe-global/api-kit";
+import Safe from "@safe-global/protocol-kit";
+import { getEnvVar, createSafeTransactionData, isValidEthereumAddress } from "./utils";
+
+async function main() {
+ dotenv.config();
+
+ try {
+ /**TODO
+ * change from SEPOLIA_RPC_URL to production URL when deploying to production
+ */
+ // Initialize web3 provider using the RPC URL from environment variables
+ const web3Provider = new ethers.JsonRpcProvider(getEnvVar("SEPOLIA_RPC_URL"));
+ // Create a signer using the orchestrator's private key and the web3 provider
+ const orchestratorSigner = new ethers.Wallet(getEnvVar("SAFE_ORCHESTRATOR_PRIVATE_KEY"), web3Provider);
+
+ // Set up Eth Adapter with ethers and the signer
+ const ethAdapter = new EthersAdapter({
+ ethers,
+ signerOrProvider: orchestratorSigner,
+ });
+
+ const chainId = await ethAdapter.getChainId();
+ const safeService = new SafeApiKit({ chainId });
+ const safeAddress = getEnvVar("SAFE_MULTISIG_ADDRESS");
+ isValidEthereumAddress(safeAddress);
+ const safeSdk = await Safe.create({ ethAdapter, safeAddress });
+
+ const permissionedProverAddress = getEnvVar("APPROVED_PROVER_ADDRESS");
+ isValidEthereumAddress(permissionedProverAddress);
+
+ await proposeSetProverTransaction(
+ safeSdk,
+ safeService,
+ await orchestratorSigner.getAddress(),
+ safeAddress,
+ permissionedProverAddress,
+ );
+
+ console.log(
+ `The other owners of the Safe Multisig wallet need to sign the transaction via the Safe UI https://app.safe.global/transactions/queue?safe=sep:${safeAddress}`,
+ );
+ } catch (error) {
+ throw new Error("An error occurred: " + error);
+ }
+}
+
+/**
+ * Function to propose the transaction data for setting the permissioned prover
+ * @param {string} safeSDK - An instance of the Safe SDK
+ * @param {string} safeService - An instance of the Safe Service
+ * @param {string} signerAddress - The address of the address signing the transaction
+ * @param {string} safeAddress - The address of the Safe multisig wallet
+ * @param {string} proverAddress - The address of the permissioned prover
+ */
+export async function proposeSetProverTransaction(
+ safeSDK: Safe,
+ safeService: SafeApiKit,
+ signerAddress: string,
+ safeAddress: string,
+ proverAddress: string,
+) {
+ // Prepare the transaction data to set the permissioned prover
+ let data = createPermissionedProverTxData(proverAddress);
+
+ const contractAddress = getEnvVar("LIGHT_CLIENT_CONTRACT_ADDRESS");
+ isValidEthereumAddress(contractAddress);
+
+ // Create the Safe Transaction Object
+ const safeTransaction = await createSafeTransaction(safeSDK, contractAddress, data, "0");
+
+ // Get the transaction hash and sign the transaction
+ const safeTxHash = await safeSDK.getTransactionHash(safeTransaction);
+
+ // Sign the transaction with orchestrator signer that was specified when we created the safeSDK
+ const senderSignature = await safeSDK.signHash(safeTxHash);
+
+ // Propose the transaction which can be signed by other owners via the Safe UI
+ await safeService.proposeTransaction({
+ safeAddress: safeAddress,
+ safeTransactionData: safeTransaction.data,
+ safeTxHash: safeTxHash,
+ senderAddress: signerAddress,
+ senderSignature: senderSignature.data,
+ });
+}
+
+/**
+ * Function to create the transaction data for setting the permissioned prover
+ * @param {string} proverAddress - The address of the permissioned prover
+ * @returns {string} - Encoded transaction data
+ */
+function createPermissionedProverTxData(proverAddress: string): string {
+ // Define the ABI of the function to be called
+ const abi = ["function setPermissionedProver(address)"];
+
+ // Encode the function call with the provided prover address
+ const data = new ethers.Interface(abi).encodeFunctionData("setPermissionedProver", [proverAddress]);
+ return data; // Return the encoded transaction data
+}
+
+/**
+ * Creates a Safe transaction object
+ *
+ * @param {Safe} safeSDK - An instance of the Safe SDK
+ * @param {string} contractAddress - The address of the contract to interact with
+ * @param {string} data - The data payload for the transaction
+ * @param {string} value - The value to be sent with the transaction
+ * @returns {Promise} - A promise that resolves to the Safe transaction object
+ */
+async function createSafeTransaction(
+ safeSDK: Safe,
+ contractAddress: string,
+ data: string,
+ value: string,
+): Promise {
+ // Prepare the safe transaction data with the contract address, data, and value
+ let safeTransactionData = createSafeTransactionData(contractAddress, data, value);
+
+ // Create the safe transaction using the Safe SDK
+ const safeTransaction = await safeSDK.createTransaction({ transactions: [safeTransactionData] });
+
+ return safeTransaction;
+}
+
+main();
diff --git a/contracts/script/multisigTransactionProposals/safeSDK/utils.ts b/contracts/script/multisigTransactionProposals/safeSDK/utils.ts
new file mode 100644
index 000000000..c7fe464a5
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/safeSDK/utils.ts
@@ -0,0 +1,53 @@
+import { ethers } from "ethers"; // Import ethers from the ethers library
+
+/**
+ * Function to check if a given string is a valid Ethereum address
+ * @param {string} address - The Ethereum address to validate
+ * @returns {boolean} - Returns true if the address is valid, throws an error otherwise
+ */
+export function isValidEthereumAddress(address: string) {
+ if (!ethers.isAddress(address)) {
+ throw new Error("Invalid Ethereum address format"); // Throw an error if the address is invalid
+ }
+ return true; // Return true if the address is valid
+}
+
+/**
+ * Function to get the value of an environment variable from the .env file
+ * @param {string} name - The name of the environment variable to retrieve
+ * @returns {string} - Returns the value of the environment variable
+ */
+export function getEnvVar(name: string): string {
+ const value = process.env[name]; // Retrieve the environment variable value
+ // Check if the environment variable is undefined or empty
+ if (value === undefined || value === "") {
+ throw new Error(`Environment variable ${name} is not set`); // Throw an error if the environment variable is not set
+ }
+ return value; // Return the value of the environment variable
+}
+
+/**
+ * Function to create safe transaction data to be used with the safe SDK
+ * @param {string} to - The destination address for the transaction
+ * @param {string} data - The contract data to be sent
+ * @param {string} value - The value to be sent
+ * @returns {object} - Returns the safe transaction data object
+ */
+export function createSafeTransactionData(to: string, data: string, value: string) {
+ // Check if the destination address is specified
+ if (to == "") {
+ throw new Error("must specify destination address"); // Throw an error if the destination address is not specified
+ }
+ // Check if both data and value are empty
+ if (data == "" && value == "") {
+ throw new Error("Either the contract data or value to be sent must be specified"); // Throw an error if both data and value are empty
+ }
+ isValidEthereumAddress(to); // Validate the destination address
+ // Create the safe transaction data object
+ const safeTransactionData = {
+ to: to,
+ data: data,
+ value: value,
+ };
+ return safeTransactionData; // Return the safe transaction data object
+}
diff --git a/contracts/script/multisigTransactionProposals/tests/utils.test.ts b/contracts/script/multisigTransactionProposals/tests/utils.test.ts
new file mode 100644
index 000000000..2fa1a6688
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/tests/utils.test.ts
@@ -0,0 +1,87 @@
+import { createSafeTransactionData, getEnvVar, isValidEthereumAddress } from "../safeSDK/utils";
+
+// Mocking process.argv
+const originalArgv = process.argv;
+const validETHAddress = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
+
+describe("environment tests", () => {
+ afterEach(() => {
+ process.argv = originalArgv; // Reset argv after each test
+ });
+
+ it("should throw an error if SEPOLIA_RPC_URL environment variable is not set", () => {
+ process.env.SEPOLIA_RPC_URL = "";
+ expect(() => getEnvVar("SEPOLIA_RPC_URL")).toThrow();
+ });
+
+ it("should return the rpc url if SEPOLIA_RPC_URL environment variable is set", () => {
+ process.env.SEPOLIA_RPC_URL = "http://rpc";
+ const result = getEnvVar("SEPOLIA_RPC_URL");
+ expect(result).toEqual("http://rpc");
+ });
+});
+
+describe("createSafeTransactionData", () => {
+ test("should throw an error if the destination address is not specified", () => {
+ expect(() => {
+ createSafeTransactionData("", "0x", "0");
+ }).toThrow("must specify destination address");
+ });
+
+ test("should throw an error if the address is not valid", () => {
+ expect(() => {
+ createSafeTransactionData("0x123", "0x", "0");
+ }).toThrow("Invalid Ethereum address format");
+ });
+
+ test("should throw an error if both data and value are empty", () => {
+ expect(() => {
+ createSafeTransactionData(validETHAddress, "", "");
+ }).toThrow("Either the contract data or value to be sent must be specified");
+ });
+
+ test("should return safe transaction data when valid parameters are provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "0x", "100");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "0x",
+ value: "100",
+ });
+ });
+
+ test("should return safe transaction data when only data is provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "0x", "");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "0x",
+ value: "",
+ });
+ });
+
+ test("should return safe transaction data when only value is provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "", "100");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "",
+ value: "100",
+ });
+ });
+});
+
+describe("isValidEthereumAddress", () => {
+ test("should return true for a valid Ethereum address", () => {
+ expect(isValidEthereumAddress(validETHAddress)).toBe(true);
+ });
+
+ test("should throw an error for an invalid Ethereum address", () => {
+ expect(() => {
+ isValidEthereumAddress("0xInvalidEthereumAddress");
+ }).toThrow("Invalid Ethereum address format");
+ });
+
+ test("should throw an error for an empty string", () => {
+ expect(() => {
+ isValidEthereumAddress("");
+ }).toThrow("Invalid Ethereum address format");
+ });
+});
diff --git a/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json
new file mode 100644
index 000000000..2b7d992e6
--- /dev/null
+++ b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json
@@ -0,0 +1,7 @@
+{
+ "approvalProcessId": "a0dd5bf1-9766-4a2f-94b1-2a7ceb0dc5be",
+ "approvalType": "Gnosis Safe",
+ "multisig": "0xc56fA6505d10bF322e01327e22479DE78C3Bf1cE",
+ "proxyAddress": "0xbC781a2BCcdac8F65EF10EA85D765CA240D1789b",
+ "salt": 12
+}
\ No newline at end of file
diff --git a/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json
new file mode 100644
index 000000000..42cc64ab9
--- /dev/null
+++ b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json
@@ -0,0 +1,4 @@
+{
+ "contractName": "LightClient.sol",
+ "previousSalt": 12
+}
\ No newline at end of file
diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol
index 69892005f..5b7d2a69b 100644
--- a/contracts/src/LightClient.sol
+++ b/contracts/src/LightClient.sol
@@ -84,6 +84,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
/// @notice a flag that indicates when a permissioned provrer is needed
bool public permissionedProverEnabled;
+ /// @notice an array to store the L1 Block Heights where the finalizedState was updated
+ uint256[] public stateUpdateBlockNumbers;
+
+ /// @notice an array to store the HotShot Block Heights and their respective HotShot
+ /// commitments
+ HotShotCommitment[] public hotShotCommitments;
+
// === Data Structure ===
//
/// @notice The finalized HotShot state (as the digest of the entire HotShot state)
@@ -106,6 +113,14 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
uint256 threshold;
}
+ /// @notice Simplified HotShot commitment struct
+ /// @param blockHeight The block height of the latest finalized HotShot block
+ /// @param blockCommRoot The merkle root of historical block commitments (BN254::ScalarField)
+ struct HotShotCommitment {
+ uint64 blockHeight;
+ BN254.ScalarField blockCommRoot;
+ }
+
/// @notice Event that a new finalized state has been successfully verified and updated
event NewState(
uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot
@@ -131,6 +146,10 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
error PermissionedProverNotSet();
/// @notice If the same mode or prover is sent to the function, then no change is required
error NoChangeRequired();
+ /// @notice Invalid L1 Block for checking Light Client Updates, premature or in the future
+ error InsufficientSnapshotHistory();
+ /// @notice Invalid HotShot Block for checking HotShot commitments, premature or in the future
+ error InvalidHotShotBlockForCommitmentCheck();
/// @notice since the constructor initializes storage on this contract we disable it
/// @dev storage is on the proxy contract since it calls this contract via delegatecall
@@ -181,9 +200,9 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
) {
revert InvalidArgs();
}
-
states[genesisState] = genesis;
states[finalizedState] = genesis;
+
currentEpoch = 0;
blocksPerEpoch = numBlockPerEpoch;
@@ -193,6 +212,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
votingThreshold = genesis.threshold;
frozenStakeTableCommitment = initStakeTableComm;
frozenThreshold = genesis.threshold;
+
+ //add the L1 Block to stateUpdateBlockNumbers for the genesis state
+ stateUpdateBlockNumbers.push(block.number);
+
+ // add the HotShot commitment for the genesis state
+ hotShotCommitments.push(HotShotCommitment(genesis.blockHeight, genesis.blockCommRoot));
}
// === State Modifying APIs ===
@@ -251,6 +276,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
// upon successful verification, update the latest finalized state
states[finalizedState] = newState;
+
+ //add the L1 Block to stateUpdateBlockNumbers for the new finalized state
+ stateUpdateBlockNumbers.push(block.number);
+
+ //add the blockheight and blockCommRoot to hotShotCommitments for the new finalized state
+ hotShotCommitments.push(HotShotCommitment(newState.blockHeight, newState.blockCommRoot));
+
emit NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
}
@@ -331,7 +363,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
/// @notice set the permissionedProverMode to false and set the permissionedProver to address(0)
/// @dev if it was already disabled (permissioneProverMode == false), then revert with
- /// NoChangeRequired
function disablePermissionedProverMode() public onlyOwner {
if (permissionedProverEnabled) {
permissionedProver = address(0);
@@ -341,4 +372,80 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
revert NoChangeRequired();
}
}
+
+ /// @notice check if more than threshold blocks passed since the last state update before
+ /// L1 Block Number
+ /// @param blockNumber The L1 block number
+ /// @param threshold The number of blocks updates to this contract is allowed to lag behind
+ function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 threshold)
+ public
+ view
+ returns (bool)
+ {
+ uint256 updatesCount = stateUpdateBlockNumbers.length;
+
+ // Handling Edge Cases
+ // Edgecase 1: The block is in the future or in the past before HotShot was live
+ if (blockNumber > block.number || updatesCount < 3) {
+ revert InsufficientSnapshotHistory();
+ }
+
+ uint256 prevBlock;
+ bool prevUpdateFound;
+
+ uint256 i = updatesCount - 1;
+ while (!prevUpdateFound) {
+ if (stateUpdateBlockNumbers[i] <= blockNumber) {
+ prevUpdateFound = true;
+ prevBlock = stateUpdateBlockNumbers[i];
+ }
+
+ // We don't consider the lag time for the first two updates
+ if (i < 2) {
+ break;
+ }
+ i--;
+ }
+
+ // If no snapshot is found, we don't have enough history stored to tell whether HotShot was
+ // down.
+ if (!prevUpdateFound) {
+ revert InsufficientSnapshotHistory();
+ }
+
+ return blockNumber - prevBlock > threshold;
+ }
+
+ /// @notice get the number of L1 block updates
+ function getStateUpdateBlockNumbersCount() public view returns (uint256) {
+ return stateUpdateBlockNumbers.length;
+ }
+
+ /// @notice get the HotShot commitment that represents the Merkle root containing the leaf at
+ /// the provided height
+ /// @param hotShotBlockHeight hotShotBlockHeight
+ function getHotShotCommitment(uint256 hotShotBlockHeight)
+ public
+ view
+ returns (HotShotCommitment memory)
+ {
+ uint256 commitmentsHeight = hotShotCommitments.length;
+ if (hotShotBlockHeight >= hotShotCommitments[commitmentsHeight - 1].blockHeight) {
+ revert InvalidHotShotBlockForCommitmentCheck();
+ }
+ for (uint256 i = 0; i < commitmentsHeight; i++) {
+ // The first commitment greater than the provided height is the root of the tree
+ // that leaf at that HotShot height
+ if (hotShotCommitments[i].blockHeight > hotShotBlockHeight) {
+ return hotShotCommitments[i];
+ }
+ }
+
+ return hotShotCommitments[commitmentsHeight - 1];
+ }
+
+ /// @notice get the number of HotShot block commitments
+ function getHotShotBlockCommitmentsCount() public view returns (uint256) {
+ return hotShotCommitments.length;
+ }
}
diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol
index d9da161f9..4e074e187 100644
--- a/contracts/test/LightClient.t.sol
+++ b/contracts/test/LightClient.t.sol
@@ -18,6 +18,7 @@ import { BN254 } from "bn254/BN254.sol";
contract LightClientCommonTest is Test {
LCMock public lc;
uint32 public constant BLOCKS_PER_EPOCH_TEST = 3;
+ uint32 public constant DELAY_THRESHOLD = 6;
LC.LightClientState public genesis;
// this constant should be consistent with `hotshot_contract::light_client.rs`
uint64 internal constant STAKE_TABLE_CAPACITY = 10;
@@ -613,3 +614,309 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest {
lc.newFinalizedState(newState, proof);
}
}
+
+contract LightClient_StateUpdatesTest is LightClientCommonTest {
+ LC.LightClientState internal newState;
+ V.PlonkProof internal newProof;
+
+ /**
+ * Liveness test cases to consider
+ * Outside of HotShot threshold, revert
+ * OnlyOneUpdate - HotShot is live
+ * OnlyTwoUpdates - HotShot is live unless blockNumber is past the 2nd blockupdate and past the
+ * threshold
+ */
+ function setUp() public {
+ init();
+ // Assert owner is correctly set, add this to check owner state
+ assertEq(lc.owner(), admin, "Admin should be the owner.");
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ newState = states[1];
+ newProof = proofs[1];
+ }
+
+ function test_1lBlockUpdatesIsUpdated() public {
+ uint256 blockUpdatesCount = lc.getStateUpdateBlockNumbersCount();
+
+ // Update the state and thus the l1BlockUpdates array would be updated
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), blockUpdatesCount + 1);
+ }
+
+ function test_hotshotIsLiveFunctionWhenNoDelayOccurred() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](5);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7
+ updates[3] = updates[2] + DELAY_THRESHOLD + 5; // 18
+ updates[4] = updates[3] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[4] + (DELAY_THRESHOLD * 5));
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 5);
+
+ // Reverts as it's within the first two updates which aren't valid times to check since it
+ // was just getting initialized
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[1] - 1, DELAY_THRESHOLD);
+
+ // Hotshot should be live (l1BlockNumber = 7)
+ assertFalse(lc.lagOverEscapeHatchThreshold(updates[2], DELAY_THRESHOLD));
+ }
+
+ function test_hotshotIsDownWhenADelayExists() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](5);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7
+ updates[3] = updates[2] + DELAY_THRESHOLD + 5; // 18
+ updates[4] = updates[3] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[4] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be down (l1BlockNumber = 15)
+ // for a block that should have been recorded but wasn't due to a delay
+ assertTrue(
+ lc.lagOverEscapeHatchThreshold(updates[2] + DELAY_THRESHOLD + 2, DELAY_THRESHOLD)
+ );
+ }
+
+ function test_revertWhenThereAreOnlyTwoUpdates() public {
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD + 5; //12
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 5);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 2);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_revertWhenThereIsOnlyOneUpdate() public {
+ uint256[] memory updates = new uint256[](1);
+ updates[0] = 1;
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 3);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 1);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_revertWhenBlockRequestedWithinFirstTwoUpdates() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 5);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 3);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_hotShotIsDownWhenBlockIsHigherThanLastRecordedAndTheDelayThresholdHasPassed()
+ public
+ {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[2] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be down (l1BlockNumber = 29)
+ // in a block that's higher than the last recorded and past the delay threshold
+ assertTrue(
+ lc.lagOverEscapeHatchThreshold(updates[2] + DELAY_THRESHOLD + 3, DELAY_THRESHOLD)
+ );
+ }
+
+ function test_hotShotIsLiveWhenBlockIsHigherThanLastRecordedAndTheDelayThresholdHasNotPassed()
+ public
+ {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[2] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be live (l1BlockNumber = 24)
+ assertFalse(lc.lagOverEscapeHatchThreshold(updates[2] + 3, DELAY_THRESHOLD));
+ }
+
+ function test_revertWhenBlockInFuture() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block
+ uint256 currBlock = 20;
+ vm.roll(currBlock);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+
+ lc.lagOverEscapeHatchThreshold(currBlock + 5, DELAY_THRESHOLD);
+ }
+
+ function test_revertWhenRequestedBlockIsBeforeHotShotFirstBlock() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block
+ uint256 currBlock = 20;
+ vm.roll(currBlock);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+
+ lc.lagOverEscapeHatchThreshold(updates[0] - 1, DELAY_THRESHOLD);
+ }
+}
+
+contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest {
+ LC.LightClientState internal newState;
+ V.PlonkProof internal newProof;
+
+ /**
+ * Liveness test cases to consider
+ * Outside of HotShot threshold, revert
+ * OnlyOneUpdate - HotShot is live
+ * OnlyTwoUpdates - HotShot is live unless blockNumber is past the 2nd blockupdate and past the
+ * threshold
+ */
+ function setUp() public {
+ init();
+ // Assert owner is correctly set, add this to check owner state
+ assertEq(lc.owner(), admin, "Admin should be the owner.");
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ newState = _states[1];
+ newProof = _proofs[1];
+ }
+
+ function assertEqBN254(BN254.ScalarField a, BN254.ScalarField b) public pure {
+ assertEq(BN254.ScalarField.unwrap(a), BN254.ScalarField.unwrap(b));
+ }
+
+ function assertNotEqBN254(BN254.ScalarField a, BN254.ScalarField b) public pure {
+ assertNotEq(BN254.ScalarField.unwrap(a), BN254.ScalarField.unwrap(b));
+ }
+
+ function test_hotShotBlockCommIsUpdated() public {
+ uint256 blockCommCount = lc.getHotShotBlockCommitmentsCount();
+
+ // Update the state and thus the l1BlockUpdates array would be updated
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ assertEq(lc.getHotShotBlockCommitmentsCount(), blockCommCount + 1);
+ }
+
+ function test_hotShotBlockCommIsUpdatedXTimes() public {
+ uint256 blockCommCount = lc.getHotShotBlockCommitmentsCount();
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ uint256 statesCount = _states.length - 1;
+ // Update the state and thus the l1BlockUpdates array would be updated
+ for (uint8 i = 1; i <= statesCount; i++) {
+ LC.LightClientState memory state = _states[i];
+ V.PlonkProof memory proof = _proofs[i];
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot);
+ lc.newFinalizedState(state, proof);
+ }
+
+ assertEq(lc.getHotShotBlockCommitmentsCount(), blockCommCount + statesCount);
+ }
+
+ function test_GetHotShotCommitmentValid() public {
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ // Test for a smaller hotShotBlockHeight
+ BN254.ScalarField blockComm =
+ lc.getHotShotCommitment(newState.blockHeight - 1).blockCommRoot;
+ assertEqBN254(blockComm, newState.blockCommRoot);
+ }
+
+ function test_revertWhenGetHotShotCommitmentInvalidHigh() public {
+ // Get the highest HotShot blockheight recorded
+ uint256 numCommitments = lc.getHotShotBlockCommitmentsCount();
+ (uint64 blockHeight,) = lc.hotShotCommitments(numCommitments - 1);
+
+ // Expect revert when attempting to retrieve a block height higher than the highest one
+ // recorded
+ vm.expectRevert(LC.InvalidHotShotBlockForCommitmentCheck.selector);
+ lc.getHotShotCommitment(blockHeight + 1);
+ }
+}
diff --git a/contracts/test/StakeTable.t.sol b/contracts/test/StakeTable.t.sol
index 3018b7fb5..d91daaee4 100644
--- a/contracts/test/StakeTable.t.sol
+++ b/contracts/test/StakeTable.t.sol
@@ -120,6 +120,7 @@ contract StakeTable_Test is StakeTableCommonTest {
abi.decode(result, (LC.LightClientState, bytes32, bytes32));
genesis = state;
+
lc = new LCTest(genesis, BLOCKS_PER_EPOCH_TEST);
stakeTable = new S(address(token), address(lc), 10);
}
diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol
index 7fddae0ca..06f834886 100644
--- a/contracts/test/mocks/LightClientMock.sol
+++ b/contracts/test/mocks/LightClientMock.sol
@@ -47,4 +47,22 @@ contract LightClientMock is LC {
revert InvalidProof();
}
}
+
+ function setStateUpdateBlockNumbers(uint256[] memory values) public {
+ // Empty the array
+ delete stateUpdateBlockNumbers;
+
+ // Set the stateUpdateBlockNumbers to the new values
+ stateUpdateBlockNumbers = values;
+ }
+
+ function setHotShotCommitments(HotShotCommitment[] memory values) public {
+ // Empty the array
+ delete hotShotCommitments;
+
+ // Set the hotShotCommitments to the new values
+ for (uint256 i = 0; i < values.length; i++) {
+ hotShotCommitments.push(values[i]);
+ }
+ }
}
diff --git a/cross-shell.nix b/cross-shell.nix
index b9b3949d9..604dfd82c 100644
--- a/cross-shell.nix
+++ b/cross-shell.nix
@@ -1,7 +1,7 @@
# A simplest nix shell file with the project dependencies and
# a cross-compilation support.
-{ pkgs, RUSTFLAGS, RUST_LOG, RUST_BACKTRACE, CARGO_TARGET_DIR }:
-pkgs.mkShell {
+{ pkgs, envVars }:
+pkgs.mkShell (envVars // {
# Native project dependencies like build utilities and additional routines
# like container building, linters, etc.
nativeBuildInputs = with pkgs.pkgsBuildHost; [
@@ -25,5 +25,4 @@ pkgs.mkShell {
rustCrossHook
];
- inherit RUSTFLAGS RUST_LOG RUST_BACKTRACE CARGO_TARGET_DIR;
-}
+})
diff --git a/data/README.md b/data/README.md
index c4f6a6934..42d9a011d 100644
--- a/data/README.md
+++ b/data/README.md
@@ -1,15 +1,16 @@
# Reference Data
This directory contains reference instantiations of the data types used by the sequencer which have a stable
-language-agnostic interface for serialization (via JSON) and cryptographic commitments. The objects in this directory
-have well-known commitments. They serve as examples of the data formats used by the Espresso Sequencer, and can be used
-as test cases for ports of the serialization and commitment algorithms to other languages.
+language-agnostic interface for serialization (in both `.json` files and binary `.bin` files) and cryptographic
+commitments. The objects in this directory have well-known commitments. They serve as examples of the data formats used
+by the Espresso Sequencer, and can be used as test cases for ports of the serialization and commitment algorithms to
+other languages.
-The Rust module `sequencer::block::reference` contains test cases which are designed to fail if the serialization format
+The Rust module `sequencer::reference_tests` contains test cases which are designed to fail if the serialization format
or commitment scheme for any of these data types changes. If you make a breaking change, you may need to update these
reference objects as well. Running those tests will also print out information about the commitments of these reference
objects, which can be useful for generating test cases for ports. To run them and get the output, use
```bash
-cargo test --all-features -p sequencer -- --nocapture --test-threads 1 block::reference
+cargo test --all-features -p sequencer -- --nocapture --test-threads 1 reference_tests
```
diff --git a/data/chain_config.bin b/data/chain_config.bin
new file mode 100644
index 000000000..188812406
Binary files /dev/null and b/data/chain_config.bin differ
diff --git a/data/chain_config.json b/data/chain_config.json
new file mode 100644
index 000000000..4f0650f18
--- /dev/null
+++ b/data/chain_config.json
@@ -0,0 +1,7 @@
+{
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": "0x0000000000000000000000000000000000000000",
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+}
diff --git a/data/fee_info.bin b/data/fee_info.bin
new file mode 100644
index 000000000..debddd9d0
Binary files /dev/null and b/data/fee_info.bin differ
diff --git a/data/fee_info.json b/data/fee_info.json
new file mode 100644
index 000000000..ae0867bb1
--- /dev/null
+++ b/data/fee_info.json
@@ -0,0 +1,4 @@
+{
+ "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "amount": "0"
+}
diff --git a/data/genesis/cappuccino.toml b/data/genesis/cappuccino.toml
new file mode 100644
index 000000000..4f79e5024
--- /dev/null
+++ b/data/genesis/cappuccino.toml
@@ -0,0 +1,11 @@
+[stake_table]
+capacity = 200
+
+[chain_config]
+chain_id = 0
+base_fee = '0 wei'
+max_block_size = '30mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
diff --git a/data/genesis/demo.toml b/data/genesis/demo.toml
new file mode 100644
index 000000000..5c52dc386
--- /dev/null
+++ b/data/genesis/demo.toml
@@ -0,0 +1,25 @@
+[stake_table]
+capacity = 10
+
+[chain_config]
+chain_id = 999999999
+base_fee = '1 wei'
+max_block_size = '1mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+fee_contract = '0xa15bb66138824a1c7167f5e85b957d04dd34e468'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
+
+[[upgrade]]
+version = "0.2"
+view = 5
+propose_window = 10
+
+
+[upgrade.chain_config]
+chain_id = 999999999
+base_fee = '2 wei'
+max_block_size = '1mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+fee_contract = '0xa15bb66138824a1c7167f5e85b957d04dd34e468'
diff --git a/data/genesis/staging.toml b/data/genesis/staging.toml
new file mode 100644
index 000000000..02a2def78
--- /dev/null
+++ b/data/genesis/staging.toml
@@ -0,0 +1,11 @@
+[stake_table]
+capacity = 200
+
+[chain_config]
+chain_id = 888888888
+base_fee = '0 wei'
+max_block_size = '30mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
diff --git a/data/header.bin b/data/header.bin
new file mode 100644
index 000000000..c1fa7a2dd
Binary files /dev/null and b/data/header.bin differ
diff --git a/data/header.json b/data/header.json
index 42769ec1d..8868bc435 100644
--- a/data/header.json
+++ b/data/header.json
@@ -1,19 +1,37 @@
{
- "height": 42,
- "timestamp": 789,
- "l1_head": 124,
- "l1_finalized": {
- "number": 123,
- "timestamp": "0x456",
- "hash": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
- },
- "payload_commitment": "HASH~1yS-KEtL3oDZDBJdsW51Pd7zywIiHesBZsTbpOzrxOfu",
- "builder_commitment": "BUILDER_COMMITMENT~1yS-KEtL3oDZDBJdsW51Pd7zywIiHesBZsTbpOzrxOdZ",
- "ns_table": {
- "bytes": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- },
- "block_merkle_tree_root": "MERKLE_COMM~yB4_Aqa35_PoskgTpcCR1oVLh6BUdLHIs7erHKWi-usUAAAAAAAAAAEAAAAAAAAAJg",
- "fee_merkle_tree_root": "MERKLE_COMM~VJ9z239aP9GZDrHp3VxwPd_0l28Hc5KEAB1pFeCIxhYgAAAAAAAAAAIAAAAAAAAAdA",
- "fee_info": { "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "amount": "0x0" },
- "chain_config": { "chain_config": { "Left": { "chain_id": "0x8a19", "max_block_size": 10240, "base_fee": "0x0" } } }
-}
+ "block_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAQA",
+ "builder_commitment": "BUILDER_COMMITMENT~upd4eFij7NNHTMYiVQoL-hDBw3bJiOMmCoNJxxgGwJ6h",
+ "builder_signature": {
+ "r": "0xc7b7c4062ada11d09530d759af4f2d9d84dd2d1ca6117299dee9b36e039642b6",
+ "s": "0x10cc3c7c0d0d69ba19348c720ee95cbb48470b9181cc32c9922af86b83fba9a2",
+ "v": 27
+ },
+ "chain_config": {
+ "chain_config": {
+ "Left": {
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": "0x0000000000000000000000000000000000000000",
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+ }
+ }
+ },
+ "fee_info": {
+ "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "amount": "0"
+ },
+ "fee_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAKA",
+ "height": 42,
+ "l1_finalized": {
+ "hash": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
+ "number": 123,
+ "timestamp": "0x456"
+ },
+ "l1_head": 124,
+ "ns_table": {
+ "bytes": "AQAAAO7/wAAIBAAA"
+ },
+ "payload_commitment": "HASH~Ojg3e_G9UzTwOygEDDcbvgakaVCqMByIiFrlkLXT72qf",
+ "timestamp": 789
+}
\ No newline at end of file
diff --git a/data/l1_block.bin b/data/l1_block.bin
new file mode 100644
index 000000000..ecffa9fdc
Binary files /dev/null and b/data/l1_block.bin differ
diff --git a/data/messages.bin b/data/messages.bin
new file mode 100644
index 000000000..a3962ad3d
Binary files /dev/null and b/data/messages.bin differ
diff --git a/data/messages.json b/data/messages.json
new file mode 100644
index 000000000..3a5a37686
--- /dev/null
+++ b/data/messages.json
@@ -0,0 +1,427 @@
+[
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "Proposal": {
+ "_pd": null,
+ "data": {
+ "block_header": {
+ "block_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAQA",
+ "builder_commitment": "BUILDER_COMMITMENT~tEvs0rxqOiMCvfe2R0omNNaphSlUiEDrb2q0IZpRcgA_",
+ "builder_signature": null,
+ "chain_config": {
+ "chain_config": {
+ "Left": {
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": null,
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+ }
+ }
+ },
+ "fee_info": {
+ "account": "0x0000000000000000000000000000000000000000",
+ "amount": "0"
+ },
+ "fee_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAKA",
+ "height": 0,
+ "l1_finalized": null,
+ "l1_head": 0,
+ "ns_table": {
+ "bytes": "AAAAAA=="
+ },
+ "payload_commitment": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29",
+ "timestamp": 0
+ },
+ "justify_qc": {
+ "_pd": null,
+ "data": {
+ "leaf_commit": "COMMIT~eaBGKF8-lw-t211wxLq7tcXEEqacbvDVcFFR9aCddO3G"
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~0-ZxNgMSsUEPeGDdq5-TZE8PDsYwgI4O2fVGMKooP87D"
+ },
+ "proposal_certificate": {
+ "Timeout": {
+ "_pd": null,
+ "data": {
+ "view": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~TZG1F34lxU6Ny9aKQMkjZAxjW9zotdwW75EHEGbyALOi"
+ }
+ },
+ "upgrade_certificate": {
+ "_pd": null,
+ "data": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~roiQgLLeI4uYqYxjz-0jPwtLyNhSlnfriPEVZ-_4RUrW"
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "Vote": {
+ "data": {
+ "leaf_commit": "COMMIT~eaBGKF8-lw-t211wxLq7tcXEEqacbvDVcFFR9aCddO3G"
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncPreCommitVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncCommitVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncFinalizeVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncPreCommitCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~OQecZxfFpuEuPJgkpsQoglnqY0fm6Qi1PUarYCgiFQ0T"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncCommitCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~POgBCaDjtUV3Il5-FXVr5KN2KzYSgipfKX6Ci0-nxduO"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncFinalizeCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~s5i9wmQWH7VU90CUiEWRdAG19LI1iXydSMxp9gZ7kHco"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "TimeoutVote": {
+ "data": {
+ "view": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "UpgradeProposal": {
+ "_pd": null,
+ "data": {
+ "upgrade_proposal": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "UpgradeVote": {
+ "data": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaProposal": {
+ "_pd": null,
+ "data": {
+ "encoded_transactions": [
+ 1,
+ 0,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "metadata": {
+ "bytes": "AQAAAAEAAAALAAAA"
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaVote": {
+ "data": {
+ "payload_commit": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29"
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaCertificate": {
+ "_pd": null,
+ "data": {
+ "payload_commit": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29"
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~5E3F3rC4E9DBhMBqOTmjZ9tjX4VFaV5gqrZJl0y6V05D"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "VidDisperseMsg": {
+ "_pd": null,
+ "data": {
+ "common": {
+ "all_evals_digest": "FIELD~rF4TMFZMXJCieDeov31aNuDG5nDGR-iQdteEgBjXkErn",
+ "multiplicity": 1,
+ "num_storage_nodes": 1,
+ "payload_byte_len": 11,
+ "poly_commits": "FIELD~AQAAAAAAAAD2xsICwO-z0CXx_ucl0FV1j-zJ3tgPO-OL8gYLvXkIkNE"
+ },
+ "payload_commitment": "HASH~Z03vXeC1EEaBGf5iacsBEWYiA7PHi3K6uS9gVpmlUx3t",
+ "recipient_key": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "share": {
+ "aggregate_proofs": "FIELD~AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGY",
+ "evals": "FIELD~AQAAAAAAAAABAAAAAwAAAAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAMk",
+ "evals_proof": {
+ "pos": "FIELD~AAAAAAAAAAD7",
+ "proof": [
+ {
+ "Leaf": {
+ "elem": "FIELD~AQAAAAAAAAABAAAAAwAAAAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAMk",
+ "pos": "FIELD~AAAAAAAAAAD7",
+ "value": "FIELD~rF4TMFZMXJCieDeov31aNuDG5nDGR-iQdteEgBjXkErn"
+ }
+ }
+ ]
+ },
+ "index": 0
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Data": {
+ "SubmitTransaction": [
+ {
+ "namespace": 1,
+ "payload": "AQID"
+ },
+ 0
+ ]
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ }
+]
\ No newline at end of file
diff --git a/data/ns_table.bin b/data/ns_table.bin
new file mode 100644
index 000000000..82defd7bc
Binary files /dev/null and b/data/ns_table.bin differ
diff --git a/data/ns_table.json b/data/ns_table.json
index 767edc5b0..6e29afa0b 100644
--- a/data/ns_table.json
+++ b/data/ns_table.json
@@ -1,3 +1,3 @@
{
- "bytes": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-}
+ "bytes": "AQAAAO7/wAAIBAAA"
+}
\ No newline at end of file
diff --git a/data/payload.bin b/data/payload.bin
new file mode 100644
index 000000000..719c44d63
Binary files /dev/null and b/data/payload.bin differ
diff --git a/data/payload.json b/data/payload.json
new file mode 100644
index 000000000..3ece05b31
--- /dev/null
+++ b/data/payload.json
@@ -0,0 +1,6 @@
+{
+ "ns_table": {
+ "bytes": "AQAAAO7/wAAIBAAA"
+ },
+ "raw_payload": "AQAAAAAEAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f4AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f4AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f4AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f4AAQID"
+}
\ No newline at end of file
diff --git a/data/transaction.bin b/data/transaction.bin
new file mode 100644
index 000000000..a0e15c9e9
Binary files /dev/null and b/data/transaction.bin differ
diff --git a/data/transaction.json b/data/transaction.json
index 201c1350e..5ca56e3e3 100644
--- a/data/transaction.json
+++ b/data/transaction.json
@@ -1,4 +1,4 @@
{
- "namespace": 12648430,
- "payload": "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMgbGVjdHVzIHZlbGl0LCBjb21tb2RvIGVnZXQgdGVsbHVzIHZpdGFlLCBtb2xlc3RpZSBtYXhpbXVzIHR1cnBpcy4gTWFlY2VuYXMgbGFjdXMgbWF1cmlzLCBhdWN0b3IgcXVpcyBsYWN1cyBhdCwgYXVjdG9yIHZvbHV0cGF0IG5pc2kuIEZ1c2NlIG1vbGVzdGllIHVybmEgc2l0IGFtZXQgcXVhbSBpbXBlcmRpZXQgc3VzY2lwaXQuIERvbmVjIGVsaXQgbGVjdHVzLCBkYXBpYnVzIGluIGlwc3VtIGV0LCB2aXZlcnJhIHBoYXJldHJhIGZlbGlzLiBTZWQgc2VkIHNlbSBzZWQgbGliZXJvIHNlbXBlciBwb3N1ZXJlLiBVdCBldWlzbW9kIHB1cnVzIGF0IG1vbGVzdGllIHZvbHV0cGF0LiBOdW5jIGV1aXNtb2QgaWQgZXN0IG5lYyBldWlzbW9kLiBBbGlxdWFtIHF1aXMgZXJhdCBiaWJlbmR1bSwgZWdlc3RhcyBhdWd1ZSBxdWlzLCB0aW5jaWR1bnQgdGVsbHVzLiBEdWlzIGRhcGlidXMgYWMganVzdG8gdXQgcmhvbmN1cy4gTnVsbGEgdmVoaWN1bGEgYXVndWUgbm9uIGFyY3UgdmVzdGlidWx1bSB0ZW1wdXMuIER1aXMgdWxsYW1jb3JwZXIgc2l0IGFtZXQgbGFjdXMgZXQgZGlnbmlzc2ltLiBNYXVyaXMgYXVjdG9yIHNvbGxpY2l0dWRpbiBmZXVnaWF0LiBGdXNjZSB0aW5jaWR1bnQgY29uZGltZW50dW0gZGFwaWJ1cy4gQWxpcXVhbSBhcmN1IGxlY3R1cywgYmxhbmRpdCBzZWQgc2VtIHNpdCBhbWV0LCBmZXJtZW50dW0gdmVoaWN1bGEgbWV0dXMuIE1hZWNlbmFzIHR1cnBpcyBuZXF1ZSwgdHJpc3RpcXVlIGVnZXQgdGluY2lkdW50IHV0LCBzY2VsZXJpc3F1ZSBldSBsYWN1cy4gVXQgYmxhbmRpdCBldSBsZW8gdml0YWUgdm9sdXRwYXQu"
+ "namespace": 12648430,
+ "payload": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+AAECAw=="
}
diff --git a/doc/architecture.puml b/doc/architecture.puml
index b51d13463..c45e7edb7 100644
--- a/doc/architecture.puml
+++ b/doc/architecture.puml
@@ -1,82 +1,150 @@
@startuml
-component "HotShot Sequencer" as Seq
-package "Layer 2s" as L2 {
- component "Rollup 1" as L2_1 {
- component "API (e.g. JSON-RPC)" as L2_1_RPC
- component Executor as L2_1_Exec
- component Prover as L2_1_Prover
- component "State DB" as L2_1_State
+
+package "Espresso Sequencer Network" as Network #MistyRose {
+ component "Other\nSequencer\nNodes" as Nodes
+ package CDN {
+ component Broker
+ component Marshal
+ database KeyDB
}
- component "Rollup 2" as L2_2
- component "Rollup N" as L2_N
-}
-package "Layer 1" as L1 {
- component "Sequencer Contract" as Seq_L1
- package "Rollup Contracts" as L2_L1 {
- component "Rollup 1\nContract" as L2_1_L1
- component "Rollup 2\nContract" as L2_2_L1
- component "Rollup N\nContract" as L2_N_L1
+
+ 'CDN Layout
+ Broker -> KeyDB: state
+ KeyDB -> Marshal: state
+
+ component "Sequencer Node" as Seq #Bisque {
+ database "Postgres" as DB
+ package APIs #LightCyan {
+ component "Submit" as Submit
+ component "Hotshot\nEvents\nStream\n" as EventsStream
+ component "Catchup" as Catchup
+ component "Status"
+ component "Query" as Query
+ }
+ package HotShot {
+ component "Networking"{
+ component Libp2p
+ component "CDN Client"
+ }
+ component "HotShot Events" as Events
+ }
+
+ package State as State {
+ component "State Signer" as Signer
+ component "ValidatedState" as Validated
+ }
}
+ component "HotShot state\nprover service" as HSProver
+ component "HotShot state\nrelay service" as Relay
+ component "Builder" as Builder
}
-Client -up-> L2_1_RPC : Transactions\nState queries
-note right of link
-1. Many clients submit transactions
- to each L2 simultaneously (for
- clarity only one is shown)
+' Network
+Nodes <-up- Catchup: "missing\nstate" " "
+Nodes <-> Libp2p: consensus\nmessages
+"CDN Client" <--> CDN: consensus\nmessages
+Nodes <--> CDN: consensus\nmessages
+note top of link
+ 4. HotShot consensus
end note
-L2_1_RPC -> Seq : Transaction\nRollup 1 ID
+' HotShot state
+Signer --> Relay: state, signature
note top of link
-2. L2s forward transactions to sequencer.
+ 6. HotShot proving
end note
+Relay -> HSProver: state,\nsignature bundle
-Seq -down-> L2_1_Exec : Block
-Seq -down-> L2_2 : Block
-Seq -down-> L2_N : Block
-note right of link
-3. Sequencer produces blocks --
- ordered lists of transactions.
- L2s receive blocks and execute
- transactions for their rollup.
+' Builder
+Builder --> HotShot: Espresso block
+note top of link
+ 3. Leader
+ obtains
+ Espresso
+ block
end note
+EventsStream -> Builder: transactions
-Seq -down-> Seq_L1 : Block Commitment\nQC
-note right of link
-4. Sequencer posts succinct commitment
- to block to L1. Contract verifies proof
- of sequencing (Quorum Certificate)
- then stores the block commitment.
+' Events
+Networking <-up-> Events
+Events -up-> EventsStream: events
+Events -down-> Validated
+
+' Storage
+Query --> DB
+Validated -up-> DB
+DB --> Catchup: missing\nstate
+
+package "Layer 2s / Rollups" as L2s #LightYellow {
+ component "zk Rollup Z" as ZK #LightBlue {
+ component "API (e.g. JSON-RPC)" as ZK_RPC
+ component Executor as ZK_Exec
+ component Prover as ZK_Prover
+ ZK_RPC --[hidden]> ZK_Exec
+ ZK_RPC --[hidden]> ZK_Prover
+ }
+ component "Optimistic Rollup O" #LightGreen {
+ component "API (e.g. JSON-RPC)" as OR_RPC
+ component Proposer
+ component Challenger
+ OR_RPC --[hidden]> Proposer
+ OR_RPC --[hidden]> Challenger
+ }
+}
+package "Ethereum Layer 1" as L1 #LightGray {
+ package "Espresso Contracts" as Esp_L1 {
+ component "Light Client\nContract" as LC_L1
+ component "Fee\nContract" as Fee_L1
+ }
+ package "Rollup Contracts" {
+ component "zk Rollup Z\nContract" as ZK_L1
+ component "OR Rollup O\nContract" as OR_L1
+ }
+}
+
+' Transaction submission
+entity User
+User --> ZK_RPC : rollup transaction,\nstate queries
+note top of link
+ 2. Transaction submission
end note
+User --> OR_RPC
-L2_1_Prover -> L2_1_L1 : State\nProof
-L2_2 -down-> L2_2_L1 : State\nProof
-L2_N -down-> L2_N_L1 : State\nProof
-note right of link
-5. Rollups post updated state to L1.
- ZK-rollups include a proof.
+ZK_RPC --> Submit : "transaction" " "
+Submit -> Events: transaction
+Query -up-> ZK_Exec : " " "Espresso\nheader,\nnamespace\ntransactions"
+note top of link
+ 5. Rollup
+ block
+ production
end note
+Query -up-> Proposer: " " "Espresso\nheader,\nnamespace\ntransactions"
-Seq_L1 -> L2_L1
-note bottom of link
-6. Rollup contracts read certified sequence
- of block commitments from sequencer
- contract. Verify state transition proofs
- against this sequence (ZKR) or wait for
- fraud proof against this sequence (ORU).
+
+' L1 details
+HSProver -up-> LC_L1 : HotShot\nstate\nproof
+LC_L1 -up-> ZK_L1 : " " "HotShot\ncommitment"
+LC_L1 -up-> OR_L1 : " " "HotShot\ncommitment"
+
+' ZK proof
+ZK_Prover --> ZK_L1 : rollup state proof
+note top of link
+ 7. ZK Rollup
+ proving
+end note
+
+' OR dispute
+Proposer --> OR_L1: respond
+Challenger --> OR_L1: challenge
+note top of link
+ 8. OR dispute
+end note
+
+Builder -> Fee_L1: deposit\nether
+note top of link
+ 1. Fee
+ deposit
end note
+Fee_L1 --> Validated: fee\ndeposits
-' L2 1 details
-L2_1_RPC <-down- L2_1_State : Read state
-L2_1_Exec -down-> L2_1_State : Write state
-L2_1_Prover <-down- L2_1_State : Read State
-
-' Layout
-L2_1_RPC -[hidden]r-> L2_1_Exec
-L2_1 -[hidden]r-> L2_2
-L2_2 -[hidden]r-> L2_N
-L2_1_L1 -[hidden]r-> L2_2_L1
-L2_2_L1 -[hidden]r-> L2_N_L1
-L2 -[hidden]d-> L1
-Seq -[hidden]d-> L2
@enduml
diff --git a/doc/architecture.svg b/doc/architecture.svg
index 309240c0c..4836bc167 100644
--- a/doc/architecture.svg
+++ b/doc/architecture.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/doc/sequence-diagram.puml b/doc/sequence-diagram.puml
new file mode 100644
index 000000000..1e476c7e0
--- /dev/null
+++ b/doc/sequence-diagram.puml
@@ -0,0 +1,97 @@
+@startuml
+!pragma teoz true
+actor User
+
+box Layer 2s / Rollups #LightYellow
+ box "Optimistic Rollup O" #LightGreen
+ participant "API\n(RPC)" as orrpc
+ participant Proposer
+ participant Challenger
+ end box
+ box "ZK Rollup Z" #LightBlue
+ participant "API\n(RPC)" as zkrpc
+ participant "Prover" as rprover
+ participant "Executor" as executor
+ end box
+end box
+
+box "Ethereum L1" #LightGrey
+ participant "Rollup\nContract" as RC
+ participant "Light\nClient\nContract" as LC
+ participant "Fee\nContract" as fee
+end box
+
+box Espresso Sequencer Network #MistyRose
+ box Sequencer Node #Bisque
+ box APIs #LightCyan
+ participant "Submit\nAPI" as submit
+ participant "Query\nAPI" as query
+ end box
+ participant "HotShot\nEvents\nStream" as events
+ participant "Validated\nState" as ValidatedState
+ participant "State\nSigner" as signer
+ end box
+
+ participant Builder
+ participant "HotShot\nLeader" as leader
+ participant CDN
+ participant Libp2p
+ participant "HotShot\nreplicas" as replicas
+ participant "HotShot\nstate\nrelay\nservice" as relay
+ participant "HotShot\nstate\nprover\nservice" as prover
+end box
+
+group 1. Fee deposit
+ Builder -> fee: fee deposit
+end group
+
+group 2. Transaction submisssion
+ User -> orrpc: rollup O transaction
+ orrpc -> submit: transaction
+ User -> zkrpc: rollup Z transaction
+ zkrpc -> submit: transaction
+ events -> Builder: transactions
+end group
+
+group 3. Leader obtains Espresso block
+ Builder -> leader: available blocks
+ leader -> Builder: claim block
+end group
+
+group 4. HotShot consensus
+ leader <-> replicas: consensus messages
+ & leader <-> Libp2p:
+ & Libp2p <-> replicas:
+ & replicas -> CDN:
+ fee -> ValidatedState: credit fee deposit
+ ValidatedState -> ValidatedState: apply header\ncharge fee
+end group
+
+group 5. Rollup block production
+ query -> executor: Espresso header,\ntransactions in namespace
+ executor -> executor: verify\nnamespace\nproof
+ executor -> rprover: rollup block
+end group
+
+group 6. HotShot proving
+ signer -> relay: state, signature
+ relay -> prover: state,\nsignature bundle
+ prover -> "Light\nClient\nContract" as LC: proof
+ LC -> LC: verify
+end group
+
+group 7. ZK Rollup proving
+ rprover -> RC: rollup state proof
+ group verify
+ LC -> "Rollup\nContract" as RC: HotShot\ncommitment
+ end group
+end group
+
+group 8. Optimistic Rollup dispute
+ Challenger -> RC: challenge
+ loop until dispute resolved
+ Proposer -> RC: respond
+ LC --> RC: HotShot\ncommitment
+ Challenger -> RC: respond
+end group
+@enduml
diff --git a/doc/sequence-diagram.svg b/doc/sequence-diagram.svg
new file mode 100644
index 000000000..1b5bf3cd2
--- /dev/null
+++ b/doc/sequence-diagram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docker-compose.yaml b/docker-compose.yaml
index c92035744..ec1339e59 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -15,11 +15,27 @@ services:
- "./geth-config/genesis-default.json:/genesis.json"
- "./geth-config/test-jwt-secret.txt:/config/test-jwt-secret.txt"
- deploy-contracts:
+ deploy-sequencer-contracts:
image: ghcr.io/espressosystems/espresso-sequencer/deploy:main
+ command: deploy --only fee-contract
+ environment:
+ - ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_DEPLOYER_ACCOUNT_INDEX
+ - RUST_LOG
+ - RUST_LOG_FORMAT
+ - ASYNC_STD_THREAD_COUNT
+ depends_on:
+ demo-l1-network:
+ condition: service_healthy
+
+ deploy-prover-contracts:
+ image: ghcr.io/espressosystems/espresso-sequencer/deploy:main
+ command: deploy --use-mock-contract --only hotshot,light-client
environment:
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_URL
+ - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY
- ESPRESSO_DEPLOYER_ACCOUNT_INDEX
- RUST_LOG
- RUST_LOG_FORMAT
@@ -27,7 +43,27 @@ services:
depends_on:
demo-l1-network:
condition: service_healthy
- orchestrator:
+ sequencer0:
+ condition: service_healthy
+ # Make sure this doesn't start until the other contracts have been deployed, since we use the same mnemonic.
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
+
+ fund-builder:
+ image: ghcr.io/espressosystems/espresso-sequencer/bridge:main
+ command: espresso-bridge deposit
+ environment:
+ - L1_PROVIDER=$ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_PROVIDER=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
+ - CONTRACT_ADDRESS=0xa15bb66138824a1c7167f5e85b957d04dd34e468
+ - MNEMONIC=$ESPRESSO_BUILDER_ETH_MNEMONIC
+ - ACCOUNT_INDEX=$ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX
+ - AMOUNT=1000000000000000000
+ - CONFIRMATIONS=1
+ depends_on:
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
+ sequencer1:
condition: service_healthy
orchestrator:
@@ -35,7 +71,7 @@ services:
ports:
- "$ESPRESSO_ORCHESTRATOR_PORT:$ESPRESSO_ORCHESTRATOR_PORT"
environment:
- - ESPRESSO_ORCHESTRATOR_BUILDER_URL=http://permissionless-builder:$ESPRESSO_BUILDER_SERVER_PORT
+ - ESPRESSO_ORCHESTRATOR_BUILDER_URLS=http://permissionless-builder:$ESPRESSO_BUILDER_SERVER_PORT
- ESPRESSO_ORCHESTRATOR_PORT
- ESPRESSO_ORCHESTRATOR_NUM_NODES
- ESPRESSO_ORCHESTRATOR_START_DELAY
@@ -49,7 +85,7 @@ services:
# different parts of the CDN
keydb:
image: docker.io/eqalpha/keydb:latest
- command: ["--requirepass", "changemeplease!!"]
+ command: [ "--requirepass", "changemeplease!!" ]
healthcheck:
# Attempt to PING the database
test: keydb-cli --pass changemeplease!! --raw incr PING
@@ -67,7 +103,7 @@ services:
- cdn-marshal
- -d
- redis://:changemeplease!!@keydb:6379
- - -b
+ - -b
- $ESPRESSO_CDN_SERVER_PORT
- -m
- 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
@@ -81,16 +117,16 @@ services:
- RUST_LOG
- ESPRESSO_CDN_SERVER_METRICS_PORT
image: ghcr.io/espressosystems/espresso-sequencer/cdn-broker:main
- command:
- - cdn-broker
- - -d
- - redis://:changemeplease!!@keydb:6379
- - --public-advertise-endpoint
- - broker-0:1738
- - --private-advertise-endpoint
- - broker-0:1739
- - -m
- - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
+ command:
+ - cdn-broker
+ - -d
+ - redis://:changemeplease!!@keydb:6379
+ - --public-advertise-endpoint
+ - broker-0:1738
+ - --private-advertise-endpoint
+ - broker-0:1739
+ - -m
+ - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
depends_on:
keydb:
condition: service_healthy
@@ -101,16 +137,16 @@ services:
- RUST_LOG
- ESPRESSO_CDN_SERVER_METRICS_PORT
image: ghcr.io/espressosystems/espresso-sequencer/cdn-broker:main
- command:
- - cdn-broker
- - -d
- - redis://:changemeplease!!@keydb:6379
- - --public-advertise-endpoint
- - broker-1:1738
- - --private-advertise-endpoint
- - broker-1:1739
- - -m
- - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
+ command:
+ - cdn-broker
+ - -d
+ - redis://:changemeplease!!@keydb:6379
+ - --public-advertise-endpoint
+ - broker-1:1738
+ - --private-advertise-endpoint
+ - broker-1:1739
+ - -m
+ - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
depends_on:
keydb:
condition: service_healthy
@@ -122,10 +158,10 @@ services:
- RUST_LOG
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
image: ghcr.io/espressosystems/espresso-sequencer/cdn-whitelist:main
- command:
- - cdn-whitelist
- - -d
- - redis://:changemeplease!!@keydb:6379
+ command:
+ - cdn-whitelist
+ - -d
+ - redis://:changemeplease!!@keydb:6379
depends_on:
keydb:
condition: service_healthy
@@ -138,7 +174,7 @@ services:
- "$ESPRESSO_STATE_RELAY_SERVER_PORT:$ESPRESSO_STATE_RELAY_SERVER_PORT"
environment:
- ESPRESSO_STATE_RELAY_SERVER_PORT
- - ESPRESSO_STATE_SIGNATURE_WEIGHT_THRESHOLD
+ - ESPRESSO_STATE_SIGNATURE_TOTAL_STAKE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -150,11 +186,12 @@ services:
environment:
- ESPRESSO_PROVER_SERVICE_PORT
- ESPRESSO_STATE_RELAY_SERVER_URL
- - ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
+ - ESPRESSO_SEQUENCER_URL
- ESPRESSO_STATE_PROVER_UPDATE_INTERVAL
- ESPRESSO_SEQUENCER_L1_PROVIDER
- ESPRESSO_SEQUENCER_ETH_MNEMONIC
- ESPRESSO_SEQUENCER_LIGHTCLIENT_ADDRESS
+ - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY
- MNEMONIC=$ESPRESSO_SEQUENCER_ETH_MNEMONIC
- ESPRESSO_SEQUENCER_STATE_PROVER_ACCOUNT_INDEX
- RAYON_NUM_THREADS=$PROVER_RAYON_NUM_THREADS
@@ -163,13 +200,13 @@ services:
- ASYNC_STD_THREAD_COUNT
- RAYON_NUM_THREADS
depends_on:
- orchestrator:
+ sequencer0:
condition: service_healthy
state-relay-server:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- deploy-contracts:
+ deploy-prover-contracts:
condition: service_completed_successfully
sequencer0:
@@ -177,24 +214,27 @@ services:
ports:
- "$ESPRESSO_SEQUENCER_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
- "$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT:$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT"
- # Run the full API server with all modules, default storage
- command: sequencer -- http -- query -- catchup -- status -- submit -- hotshot-events
+ # Run the full API server with all modules, Postgres storage
+ command: sequencer -- storage-sql -- http -- query -- catchup -- status -- submit -- hotshot-events -- config
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- - ESPRESSO_SEQUENCER_STORAGE_PATH
+ - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db-0
+ - ESPRESSO_SEQUENCER_POSTGRES_USER=root
+ - ESPRESSO_SEQUENCER_POSTGRES_PASSWORD=password
+ - ESPRESSO_SEQUENCER_POSTGRES_DATABASE=sequencer
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_0
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_0
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_0
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_0
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -204,7 +244,7 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- sequencer-db:
+ sequencer-db-0:
condition: service_healthy
state-relay-server:
condition: service_healthy
@@ -214,30 +254,33 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer1:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
ports:
- "$ESPRESSO_SEQUENCER1_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
- command: sequencer -- storage-sql -- http -- query -- catchup -- state
+ command: sequencer -- storage-sql -- http -- query -- catchup -- status -- state -- explorer
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_API_PEERS=http://sequencer2:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer2:$ESPRESSO_SEQUENCER_API_PORT
- - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db
+ - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db-1
- ESPRESSO_SEQUENCER_POSTGRES_USER=root
- ESPRESSO_SEQUENCER_POSTGRES_PASSWORD=password
+ - ESPRESSO_SEQUENCER_POSTGRES_DATABASE=sequencer
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_1
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_1
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_1
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer1:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_1
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -247,6 +290,8 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
+ sequencer-db-1:
+ condition: service_healthy
state-relay-server:
condition: service_healthy
broker-0:
@@ -255,6 +300,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer2:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -262,20 +309,20 @@ services:
- "$ESPRESSO_SEQUENCER2_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_API_PEERS=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer3:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_2
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_2
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer2:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -293,6 +340,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer3:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -300,19 +349,19 @@ services:
- "$ESPRESSO_SEQUENCER3_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer4:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_3
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_3
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer3:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -329,6 +378,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer4:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -336,19 +387,19 @@ services:
- "$ESPRESSO_SEQUENCER4_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer0:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_4
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_4
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer4:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -365,6 +416,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
commitment-task:
image: ghcr.io/espressosystems/espresso-sequencer/commitment-task:main
@@ -385,7 +438,7 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- deploy-contracts:
+ deploy-prover-contracts:
condition: service_completed_successfully
submit-transactions-public:
@@ -402,6 +455,10 @@ services:
depends_on:
sequencer0:
condition: service_healthy
+ # We don't directly depend on the builder, but transactions will not be finalized until it has
+ # started, so there is no point in starting before then.
+ permissionless-builder:
+ condition: service_healthy
submit-transactions-private:
image: ghcr.io/espressosystems/espresso-sequencer/submit-transactions:main
@@ -428,27 +485,31 @@ services:
environment:
- ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_URL=http://sequencer0:$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer0:$ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_BUILDER_GENESIS_FILE
- ESPRESSO_BUILDER_ETH_MNEMONIC
- ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX
- ESPRESSO_BUILDER_L1_PROVIDER
- ESPRESSO_BUILDER_SERVER_PORT
- - ESPRESSO_BUILDER_CHANNEL_CAPACITY
+ - ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY
+ - ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY
- ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW
- ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION
- ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT
+ - ESPRESSO_BUILDER_INIT_NODE_COUNT
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
depends_on:
- sequencer0:
- condition: service_healthy
+ fund-builder:
+ condition: service_completed_successfully
nasty-client:
image: ghcr.io/espressosystems/espresso-sequencer/nasty-client:main
ports:
- "$ESPRESSO_NASTY_CLIENT_PORT:$ESPRESSO_NASTY_CLIENT_PORT"
environment:
- - ESPRESSO_SEQUENCER_URL
+ # Point the nasty client at sequencer1, the only one running the state API.
+ - ESPRESSO_SEQUENCER_URL=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_NASTY_CLIENT_PORT
- RUST_LOG
- RUST_LOG_FORMAT
@@ -457,14 +518,15 @@ services:
sequencer0:
condition: service_healthy
- sequencer-db:
+ sequencer-db-0:
image: postgres
user: postgres
ports:
- - "$ESPRESSO_SEQUENCER_DB_PORT:5432"
+ - "$ESPRESSO_SEQUENCER0_DB_PORT:5432"
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=root
+ - POSTGRES_DB=sequencer
healthcheck:
# Postgres can be falsely "ready" once before running init scripts.
# See https://github.com/docker-library/postgres/issues/146 for discussion.
@@ -472,3 +534,30 @@ services:
interval: 5s
timeout: 4s
retries: 20
+
+ sequencer-db-1:
+ image: postgres
+ user: postgres
+ ports:
+ - "$ESPRESSO_SEQUENCER1_DB_PORT:5432"
+ environment:
+ - POSTGRES_PASSWORD=password
+ - POSTGRES_USER=root
+ - POSTGRES_DB=sequencer
+ healthcheck:
+ # Postgres can be falsely "ready" once before running init scripts.
+ # See https://github.com/docker-library/postgres/issues/146 for discussion.
+ test: "pg_isready -U root && sleep 1 && pg_isready -U root"
+ interval: 5s
+ timeout: 4s
+ retries: 20
+
+ block-explorer:
+ image: ghcr.io/espressosystems/espresso-block-explorer:main
+ ports:
+ - "$ESPRESSO_BLOCK_EXPLORER_PORT:3000"
+ environment:
+ - QUERY_SERVICE_URI:http://localhost:$ESPRESSO_SEQUENCER1_API_PORT/v0/
+ depends_on:
+ sequencer1:
+ condition: service_healthy
diff --git a/docker/espresso-bridge.Dockerfile b/docker/espresso-bridge.Dockerfile
new file mode 100644
index 000000000..ad7db1839
--- /dev/null
+++ b/docker/espresso-bridge.Dockerfile
@@ -0,0 +1,15 @@
+FROM ubuntu:jammy
+
+ARG TARGETARCH
+
+RUN apt-get update \
+ && apt-get install -y curl libcurl4 wait-for-it tini \
+ && rm -rf /var/lib/apt/lists/*
+ENTRYPOINT ["tini", "--"]
+
+COPY target/$TARGETARCH/release/espresso-bridge /bin/espresso-bridge
+RUN chmod +x /bin/espresso-bridge
+
+RUN ln -s /bin/espresso-bridge /bin/bridge
+
+CMD [ "/bin/espresso-bridge"]
diff --git a/docker/espresso-dev-node.Dockerfile b/docker/espresso-dev-node.Dockerfile
new file mode 100644
index 000000000..7b5982857
--- /dev/null
+++ b/docker/espresso-dev-node.Dockerfile
@@ -0,0 +1,26 @@
+FROM postgres
+
+ARG TARGETARCH
+
+RUN apt-get update \
+ && apt-get install -y curl libcurl4 wait-for-it tini \
+ && rm -rf /var/lib/apt/lists/*
+ENTRYPOINT ["tini", "--"]
+
+# Download an SRS file to avoid download at runtime
+ENV AZTEC_SRS_PATH=/kzg10-aztec20-srs-1048584.bin
+RUN curl -LO https://github.com/EspressoSystems/ark-srs/releases/download/v0.2.0/$AZTEC_SRS_PATH
+
+COPY target/$TARGETARCH/release/espresso-dev-node /bin/espresso-dev-node
+RUN chmod +x /bin/espresso-dev-node
+
+# When running as a Docker service, we always want a healthcheck endpoint, so set a default for the
+# port that the HTTP server will run on. This can be overridden in any given deployment environment.
+ENV ESPRESSO_SEQUENCER_API_PORT=8770
+HEALTHCHECK --interval=1s --timeout=1s --retries=100 CMD curl --fail http://localhost:${ESPRESSO_SEQUENCER_API_PORT}/status/block-height || exit 1
+
+EXPOSE 8770
+EXPOSE 8771
+EXPOSE 8772
+
+CMD [ "/bin/espresso-dev-node"]
diff --git a/docker/permissionless-builder.Dockerfile b/docker/permissionless-builder.Dockerfile
index 4140ae5f7..82424dd6e 100644
--- a/docker/permissionless-builder.Dockerfile
+++ b/docker/permissionless-builder.Dockerfile
@@ -7,6 +7,10 @@ RUN apt-get update \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["tini", "--"]
+# Install genesis files for all supported configurations. The desired configuration can be chosen by
+# setting `ESPRESSO_BUILDER_GENESIS_FILE`.
+COPY data/genesis /genesis
+
# Download an SRS file to avoid download at runtime
ENV AZTEC_SRS_PATH=/kzg10-aztec20-srs-1048584.bin
RUN curl -LO https://github.com/EspressoSystems/ark-srs/releases/download/v0.2.0/$AZTEC_SRS_PATH
diff --git a/docker/scripts/sequencer-awssecretsmanager.sh b/docker/scripts/sequencer-awssecretsmanager.sh
new file mode 100644
index 000000000..582cd36f2
--- /dev/null
+++ b/docker/scripts/sequencer-awssecretsmanager.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -eEu -o pipefail
+
+if [[ -v ESPRESSO_SEQUENCER_GENESIS_SECRET ]]; then
+ echo "Loading genesis file from AWS secrets manager"
+ aws secretsmanager get-secret-value --secret-id ${ESPRESSO_SEQUENCER_GENESIS_SECRET} --query SecretString --output text | tee /genesis/injected.toml >/dev/null
+fi
+
+/bin/sequencer "$@"
diff --git a/docker/sequencer.Dockerfile b/docker/sequencer.Dockerfile
index e84367152..eac4ec5f5 100644
--- a/docker/sequencer.Dockerfile
+++ b/docker/sequencer.Dockerfile
@@ -23,6 +23,14 @@ RUN chmod +x /bin/keygen
COPY target/$TARGETARCH/release/pub-key /bin/pub-key
RUN chmod +x /bin/pub-key
+# Install genesis files for all supported configurations. The desired configuration can be chosen by
+# setting `ESPRESSO_SEQUENCER_GENESIS_FILE`.
+COPY data/genesis /genesis
+
+# Allow injecting a genesis file with aws secretsmanager
+# Set `ESPRESSO_SEQUENCER_GENESIS_SECRET`
+COPY docker/scripts/sequencer-awssecretsmanager.sh /bin/sequencer-awssecretsmanager.sh
+
# Set a path to save the consensus config on startup.
#
# Upon restart, the config will be loaded from this file and the node will be able to resume
diff --git a/flake.lock b/flake.lock
index 832aab8c3..cef230226 100644
--- a/flake.lock
+++ b/flake.lock
@@ -196,11 +196,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
- "lastModified": 1712135466,
- "narHash": "sha256-+xFfYk17EI0zZTGmhh3MyeSpl7RVohoVp/4HaSvGj4I=",
+ "lastModified": 1714727549,
+ "narHash": "sha256-CWXRTxxcgMfQubJugpeg3yVWIfm70MYTtgaKWKgD60U=",
"owner": "shazow",
"repo": "foundry.nix",
- "rev": "ece7c960a440c6725a7a5576d1f49a5fabde3747",
+ "rev": "47cf189ec395eda4b3e0623179d1075c8027ca97",
"type": "github"
},
"original": {
@@ -476,11 +476,11 @@
"nixpkgs": "nixpkgs_6"
},
"locked": {
- "lastModified": 1713838472,
- "narHash": "sha256-lCdDz6/YgyXdFRHall3P+dCETRpfz3Pi9eREnA9RX6k=",
+ "lastModified": 1714616033,
+ "narHash": "sha256-JcWAjIDl3h0bE/pII0emeHwokTeBl+SWrzwrjoRu7a0=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "28a9436d356181603fb0d333565431c3d952f299",
+ "rev": "3e416d5067ba31ff8ac31eeb763e4388bdf45089",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 59c458a30..777dba371 100644
--- a/flake.nix
+++ b/flake.nix
@@ -49,10 +49,12 @@
# node=error: disable noisy anvil output
RUST_LOG = "info,libp2p=off,isahc=error,surf=error,node=error";
RUST_BACKTRACE = 1;
- RUSTFLAGS =
- " --cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\" --cfg hotshot_example";
+ ASYNC_FLAGS = " --cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\" ";
+ RUSTFLAGS = "${ASYNC_FLAGS} --cfg hotshot_example";
+ RUSTDOCFLAGS = ASYNC_FLAGS;
# Use a distinct target dir for builds from within nix shells.
CARGO_TARGET_DIR = "target/nix";
+ rustEnvVars = { inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS RUSTDOCFLAGS CARGO_TARGET_DIR; };
solhintPkg = { buildNpmPackage, fetchFromGitHub }:
buildNpmPackage rec {
@@ -90,10 +92,11 @@
inherit overlays localSystem crossSystem;
};
in
- import ./cross-shell.nix {
- inherit pkgs;
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ import ./cross-shell.nix
+ {
+ inherit pkgs;
+ envVars = rustEnvVars;
+ };
in
with pkgs; {
checks = {
@@ -124,8 +127,7 @@
cargo-clippy = {
enable = true;
description = "Run clippy";
- entry =
- "cargo clippy --workspace --all-features --all-targets -- -D warnings";
+ entry = "just clippy";
types_or = [ "rust" "toml" ];
pass_filenames = false;
};
@@ -154,15 +156,16 @@
enable = true;
description = "Enforce markdown formatting";
entry = "prettier -w";
- types_or = [ "markdown" ];
+ types_or = [ "markdown" "ts" ];
pass_filenames = true;
};
spell-checking = {
enable = true;
description = "Spell checking";
- entry = "typos";
+ # --force-exclude to exclude excluded files if they are passed as arguments
+ entry = "typos --force-exclude";
pass_filenames = true;
- excludes = [ "contract-bindings/" ];
+ # Add excludes to the .typos.toml file instead
};
nixpkgs-fmt.enable = true;
};
@@ -180,7 +183,7 @@
'';
solc = pkgs.solc-bin.latest;
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -218,12 +221,14 @@
nodePackages.prettier
solhint
(python3.withPackages (ps: with ps; [ black ]))
-
+ yarn
] ++ lib.optionals stdenv.isDarwin
[ darwin.apple_sdk.frameworks.SystemConfiguration ]
++ lib.optionals (!stdenv.isDarwin) [ cargo-watch ] # broken on OSX
;
shellHook = ''
+ # Add node binaries to PATH
+ export PATH="$PWD/node_modules/.bin:$PATH"
# Prevent cargo aliases from using programs in `~/.cargo` to avoid conflicts
# with rustup installations.
export CARGO_HOME=$HOME/.cargo-nix
@@ -231,8 +236,7 @@
'' + self.checks.${system}.pre-commit-check.shellHook;
RUST_SRC_PATH = "${stableToolchain}/lib/rustlib/src/rust/library";
FOUNDRY_SOLC = "${solc}/bin/solc";
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
devShells.crossShell =
crossShell { config = "x86_64-unknown-linux-musl"; };
devShells.armCrossShell =
@@ -243,7 +247,7 @@
extensions = [ "rustfmt" "clippy" "llvm-tools-preview" "rust-src" ];
};
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -252,13 +256,12 @@
protobuf # to compile libp2p-autonat
toolchain
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
devShells.coverage =
let
toolchain = pkgs.rust-bin.nightly.latest.minimal;
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -268,13 +271,12 @@
toolchain
grcov
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
CARGO_INCREMENTAL = "0";
shellHook = ''
RUSTFLAGS="$RUSTFLAGS -Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests -Cdebuginfo=2"
'';
RUSTDOCFLAGS = "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests";
- };
+ });
devShells.rustShell =
let
@@ -282,7 +284,7 @@
extensions = [ "rustfmt" "clippy" "llvm-tools-preview" "rust-src" ];
};
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -291,7 +293,6 @@
protobuf # to compile libp2p-autonat
stableToolchain
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
});
}
diff --git a/foundry.toml b/foundry.toml
index e2b19ad85..061cd3fd9 100644
--- a/foundry.toml
+++ b/foundry.toml
@@ -9,7 +9,7 @@ libs = ['contracts/lib']
script = "contracts/script"
broadcast = "contracts/broadcast"
cache_path = "contracts/cache"
-optimizer_runs = 2300 # Increasing the number of runs saves gas but increases the size of the contract
+optimizer_runs = 0 # Increasing the number of runs saves gas but increases the size of the contract
# Version should match the solc installed via flake, otherwise the contract
# artifacts may differ slightly.
solc = "0.8.23"
diff --git a/hotshot-state-prover/Cargo.toml b/hotshot-state-prover/Cargo.toml
index d832988b4..4947d7ead 100644
--- a/hotshot-state-prover/Cargo.toml
+++ b/hotshot-state-prover/Cargo.toml
@@ -6,7 +6,7 @@ authors = { workspace = true }
edition = { workspace = true }
[dependencies]
-anyhow = "1.0"
+anyhow = { workspace = true }
ark-bn254 = { workspace = true }
ark-ec = { workspace = true }
ark-ed-on-bn254 = { workspace = true }
@@ -26,21 +26,25 @@ displaydoc = { version = "0.2.3", default-features = false }
es-version = { workspace = true }
ethers = { workspace = true }
futures = { workspace = true }
-hotshot-contract-adapter = { path = "../contracts/rust/adapter" }
+hotshot-contract-adapter = { workspace = true }
hotshot-orchestrator = { workspace = true }
hotshot-stake-table = { workspace = true }
hotshot-types = { workspace = true }
itertools = { workspace = true }
+jf-crhf = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-relation = { workspace = true }
+jf-rescue = { workspace = true, features = ["gadgets"] }
+jf-signature = { workspace = true, features = ["schnorr", "bls", "gadgets"] }
jf-utils = { workspace = true }
rand_chacha = { workspace = true }
+reqwest = { workspace = true }
sequencer-utils = { path = "../utils" }
serde = { workspace = true }
snafu = { workspace = true }
surf-disco = { workspace = true }
-tagged-base64 = { git = "https://github.com/EspressoSystems/tagged-base64", tag = "0.3.4" }
+tagged-base64 = { workspace = true }
tide-disco = { workspace = true }
time = { workspace = true }
toml = "0.8"
@@ -51,4 +55,4 @@ vbs = { workspace = true }
[features]
default = ["parallel"]
std = ["ark-std/std", "ark-ff/std"]
-parallel = ["jf-primitives/parallel", "jf-utils/parallel", "ark-ff/parallel"]
+parallel = ["jf-signature/parallel", "jf-utils/parallel", "ark-ff/parallel"]
diff --git a/hotshot-state-prover/src/bin/state-prover.rs b/hotshot-state-prover/src/bin/state-prover.rs
index 1d9f94fb2..f1f25a027 100644
--- a/hotshot-state-prover/src/bin/state-prover.rs
+++ b/hotshot-state-prover/src/bin/state-prover.rs
@@ -29,6 +29,10 @@ struct Args {
#[clap(short, long = "freq", value_parser = parse_duration, default_value = "10m", env = "ESPRESSO_STATE_PROVER_UPDATE_INTERVAL")]
update_interval: Duration,
+ /// Interval between retries if a state update fails
+ #[clap(long = "retry-freq", value_parser = parse_duration, default_value = "2s", env = "ESPRESSO_STATE_PROVER_RETRY_INTERVAL")]
+ retry_interval: Duration,
+
/// URL of layer 1 Ethereum JSON-RPC provider.
#[clap(
long,
@@ -53,14 +57,14 @@ struct Args {
)]
eth_account_index: u32,
- /// URL of the HotShot orchestrator.
+ /// URL of a sequencer node that is currently providing the HotShot config.
+ /// This is used to initialize the stake table.
#[clap(
- short,
long,
- env = "ESPRESSO_SEQUENCER_ORCHESTRATOR_URL",
- default_value = "http://localhost:8080"
+ env = "ESPRESSO_SEQUENCER_URL",
+ default_value = "http://localhost:24000"
)]
- pub orchestrator_url: Url,
+ pub sequencer_url: Url,
/// If daemon and provided, the service will run a basic HTTP server on the given port.
///
@@ -97,9 +101,10 @@ async fn main() {
let provider = Provider::::try_from(args.l1_provider.to_string()).unwrap();
let chain_id = provider.get_chainid().await.unwrap().as_u64();
let config = StateProverConfig {
- relay_server: args.relay_server.clone(),
+ relay_server: args.relay_server,
update_interval: args.update_interval,
- l1_provider: args.l1_provider.clone(),
+ retry_interval: args.retry_interval,
+ l1_provider: args.l1_provider,
light_client_address: args.light_client_address,
eth_signing_key: MnemonicBuilder::::default()
.phrase(args.eth_mnemonic.as_str())
@@ -110,16 +115,20 @@ async fn main() {
.with_chain_id(chain_id)
.signer()
.clone(),
- orchestrator_url: args.orchestrator_url,
+ sequencer_url: args.sequencer_url,
port: args.port,
stake_table_capacity: args.stake_table_capacity,
};
if args.daemon {
// Launching the prover service daemon
- run_prover_service(config, SEQUENCER_VERSION).await;
+ if let Err(err) = run_prover_service(config, SEQUENCER_VERSION).await {
+ tracing::error!("Error running prover service: {:?}", err);
+ };
} else {
// Run light client state update once
- run_prover_once(config, SEQUENCER_VERSION).await;
+ if let Err(err) = run_prover_once(config, SEQUENCER_VERSION).await {
+ tracing::error!("Error running prover once: {:?}", err);
+ };
}
}
diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs
index cdd262d8b..e1e2603b9 100644
--- a/hotshot-state-prover/src/circuit.rs
+++ b/hotshot-state-prover/src/circuit.rs
@@ -5,16 +5,13 @@ use ark_ff::PrimeField;
use ark_std::borrow::Borrow;
use ethers::types::U256;
use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput};
-use jf_plonk::errors::PlonkError;
-use jf_primitives::{
- circuit::{
- rescue::RescueNativeGadget,
- signature::schnorr::{SignatureGadget, VerKeyVar},
- },
- rescue::RescueParameter,
- signatures::schnorr::{Signature, VerKey as SchnorrVerKey},
+use jf_plonk::PlonkError;
+use jf_relation::{BoolVar, Circuit, CircuitError, PlonkCircuit, Variable};
+use jf_rescue::{gadgets::RescueNativeGadget, RescueParameter};
+use jf_signature::{
+ gadgets::schnorr::{SignatureGadget, VerKeyVar},
+ schnorr::{Signature, VerKey as SchnorrVerKey},
};
-use jf_relation::{errors::CircuitError, BoolVar, Circuit, PlonkCircuit, Variable};
/// Lossy conversion of a U256 into a field element.
pub(crate) fn u256_to_field(v: &U256) -> F {
@@ -380,11 +377,13 @@ mod tests {
use ark_ed_on_bn254::EdwardsConfig as Config;
use ethers::types::U256;
use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme};
- use jf_primitives::{
- crhf::{VariableLengthRescueCRHF, CRHF},
- errors::PrimitivesError,
- signatures::{schnorr::Signature, SchnorrSignatureScheme, SignatureScheme},
+ use jf_crhf::CRHF;
+ use jf_rescue::crhf::VariableLengthRescueCRHF;
+ use jf_signature::{
+ schnorr::{SchnorrSignatureScheme, Signature},
+ SignatureScheme,
};
+
use jf_relation::Circuit;
use jf_utils::test_rng;
@@ -425,7 +424,7 @@ mod tests {
let sigs = state_keys
.iter()
.map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, state_msg, &mut prng))
- .collect::, PrimitivesError>>()
+ .collect::, _>>()
.unwrap();
// bit vector with total weight 26
@@ -532,7 +531,7 @@ mod tests {
.map(|(key, _)| {
SchnorrSignatureScheme::::sign(&(), key, bad_state_msg, &mut prng)
})
- .collect::, PrimitivesError>>()
+ .collect::, _>>()
.unwrap();
let (bad_circuit, public_inputs) = build(
&entries,
@@ -557,7 +556,7 @@ mod tests {
.map(|(key, _)| {
SchnorrSignatureScheme::::sign(&(), key, wrong_state_msg, &mut prng)
})
- .collect::, PrimitivesError>>()
+ .collect::, _>>()
.unwrap();
let (bad_circuit, public_inputs) = build(
&entries,
diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs
index 82e2b7210..0b7b061f7 100644
--- a/hotshot-state-prover/src/mock_ledger.rs
+++ b/hotshot-state-prover/src/mock_ledger.rs
@@ -16,28 +16,31 @@ use hotshot_contract_adapter::jellyfish::{field_to_u256, open_key, u256_to_field
use hotshot_contract_adapter::light_client::ParsedLightClientState;
use hotshot_stake_table::vec_based::StakeTable;
-use crate::{generate_state_update_proof, preprocess, Proof, VerifyingKey};
+use crate::{
+ generate_state_update_proof, preprocess, service::one_honest_threshold, Proof, VerifyingKey,
+};
use hotshot_types::traits::stake_table::StakeTableScheme;
use hotshot_types::{
light_client::{GenericLightClientState, GenericPublicInput, LightClientState},
traits::stake_table::SnapshotVersion,
};
use itertools::izip;
+use jf_pcs::prelude::UnivariateUniversalParams;
use jf_plonk::proof_system::{PlonkKzgSnark, UniversalSNARK};
use jf_plonk::transcript::SolidityTranscript;
-use jf_primitives::pcs::prelude::UnivariateUniversalParams;
-use jf_primitives::signatures::schnorr::Signature;
-use jf_primitives::signatures::{
+use jf_relation::{Arithmetization, Circuit, PlonkCircuit};
+use jf_signature::schnorr::Signature;
+use jf_signature::{
bls_over_bn254::{BLSOverBN254CurveSignatureScheme, VerKey as BLSVerKey},
- SchnorrSignatureScheme, SignatureScheme,
+ schnorr::SchnorrSignatureScheme,
+ SignatureScheme,
};
-use jf_relation::{Arithmetization, Circuit, PlonkCircuit};
use jf_utils::test_rng;
use std::collections::HashMap;
type F = ark_ed_on_bn254::Fq;
-type SchnorrVerKey = jf_primitives::signatures::schnorr::VerKey;
-type SchnorrSignKey = jf_primitives::signatures::schnorr::SignKey;
+type SchnorrVerKey = jf_signature::schnorr::VerKey;
+type SchnorrSignKey = jf_signature::schnorr::SignKey;
/// Stake table capacity used for testing
pub const STAKE_TABLE_CAPACITY: usize = 10;
@@ -85,7 +88,8 @@ impl MockLedger {
key_archive.insert(qc_keys[i], state_keys[i].0.clone());
}
let st = stake_table_for_testing(&qc_keys, &state_keys);
- let threshold = st.total_stake(SnapshotVersion::LastEpochStart).unwrap() * 2 / 3;
+ let threshold =
+ one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap());
// arbitrary commitment values as they don't affect logic being tested
let block_comm_root = F::from(1234);
@@ -119,12 +123,11 @@ impl MockLedger {
{
self.epoch += 1;
self.st.advance();
- self.threshold = self
- .st
- .total_stake(SnapshotVersion::LastEpochStart)
- .unwrap()
- * 2
- / 3;
+ self.threshold = one_honest_threshold(
+ self.st
+ .total_stake(SnapshotVersion::LastEpochStart)
+ .unwrap(),
+ );
}
let new_root = self.new_dummy_comm();
diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs
index b877edcf0..df5263767 100644
--- a/hotshot-state-prover/src/service.rs
+++ b/hotshot-state-prover/src/service.rs
@@ -1,11 +1,11 @@
//! A light client prover service
use crate::snark::{generate_state_update_proof, Proof, ProvingKey};
-use anyhow::anyhow;
+use anyhow::{anyhow, Context, Result};
use async_std::{
io,
sync::Arc,
- task::{sleep, spawn},
+ task::{sleep, spawn, spawn_blocking},
};
use contract_bindings::light_client::{LightClient, LightClientErrors};
use displaydoc::Display;
@@ -20,10 +20,8 @@ use ethers::{
use futures::FutureExt;
use hotshot_contract_adapter::jellyfish::{u256_to_field, ParsedPlonkProof};
use hotshot_contract_adapter::light_client::ParsedLightClientState;
-use hotshot_orchestrator::OrchestratorVersion;
use hotshot_stake_table::vec_based::config::FieldType;
use hotshot_stake_table::vec_based::StakeTable;
-use hotshot_types::signature_key::BLSPubKey;
use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableError, StakeTableScheme as _};
use hotshot_types::{
light_client::{
@@ -32,11 +30,13 @@ use hotshot_types::{
},
traits::signature_key::StakeTableEntryType,
};
+use hotshot_types::{signature_key::BLSPubKey, PeerConfig};
+use jf_pcs::prelude::UnivariateUniversalParams;
use jf_plonk::errors::PlonkError;
-use jf_primitives::constants::CS_ID_SCHNORR;
-use jf_primitives::pcs::prelude::UnivariateUniversalParams;
use jf_relation::Circuit as _;
+use jf_signature::constants::CS_ID_SCHNORR;
+use serde::Deserialize;
use std::{
iter,
time::{Duration, Instant},
@@ -52,8 +52,6 @@ type F = ark_ed_on_bn254::Fq;
/// A wallet with local signer and connected to network via http
pub type L1Wallet = SignerMiddleware, LocalWallet>;
-type NetworkConfig = hotshot_orchestrator::config::NetworkConfig;
-
/// Configuration/Parameters used for hotshot state prover
#[derive(Debug, Clone)]
pub struct StateProverConfig {
@@ -61,14 +59,17 @@ pub struct StateProverConfig {
pub relay_server: Url,
/// Interval between light client state update
pub update_interval: Duration,
+ /// Interval between retries if a state update fails
+ pub retry_interval: Duration,
/// URL of layer 1 Ethereum JSON-RPC provider.
pub l1_provider: Url,
/// Address of LightClient contract on layer 1.
pub light_client_address: Address,
/// Transaction signing key for Ethereum
pub eth_signing_key: SigningKey,
- /// Address off the hotshot orchestrator, used for stake table initialization.
- pub orchestrator_url: Url,
+ /// URL of a node that is currently providing the HotShot config.
+ /// This is used to initialize the stake table.
+ pub sequencer_url: Url,
/// If daemon and provided, the service will run a basic HTTP server on the given port.
///
/// The server provides healthcheck and version endpoints.
@@ -77,6 +78,12 @@ pub struct StateProverConfig {
pub stake_table_capacity: usize,
}
+#[inline]
+/// A helper function to compute the quorum threshold given a total amount of stake.
+pub fn one_honest_threshold(total_stake: U256) -> U256 {
+ total_stake / 3 + 1
+}
+
pub fn init_stake_table(
bls_keys: &[BLSPubKey],
state_keys: &[StateVerKey],
@@ -95,67 +102,81 @@ pub fn init_stake_table(
Ok(st)
}
-async fn init_stake_table_from_orchestrator(
- orchestrator_url: &Url,
+#[derive(Debug, Deserialize)]
+pub struct PublicHotShotConfig {
+ pub known_nodes_with_stake: Vec>,
+}
+
+/// Initialize the stake table from a sequencer node that
+/// is currently providing the HotShot config.
+///
+/// Does not error, runs until the stake table is provided.
+async fn init_stake_table_from_sequencer(
+ sequencer_url: &Url,
stake_table_capacity: usize,
-) -> StakeTable {
- tracing::info!("Initializing stake table from HotShot orchestrator.");
- let client = Client::::new(orchestrator_url.clone());
- loop {
- match client.get::("api/peer_pub_ready").send().await {
- Ok(true) => {
- match client
- .get::("api/get_config_after_peer_collected")
- .send()
- .await
- {
- Ok(config) => {
- let mut st = StakeTable::::new(
- stake_table_capacity,
- );
- tracing::debug!("{}", config.config.known_nodes_with_stake.len());
- config
- .config
- .known_nodes_with_stake
- .into_iter()
- .for_each(|config| {
- st.register(
- *config.stake_table_entry.get_key(),
- config.stake_table_entry.get_stake(),
- config.state_ver_key,
- )
- .expect("Key registration shouldn't fail.");
- });
- st.advance();
- st.advance();
- return st;
- }
- Err(e) => {
- tracing::warn!("Orchestrator error: {e}, retrying.");
- }
+) -> Result> {
+ tracing::info!("Initializing stake table from node at {sequencer_url}");
+
+ // Construct the URL to fetch the network config
+ let config_url = sequencer_url
+ .join("/v0/config/hotshot")
+ .with_context(|| "Invalid URL")?;
+
+ // Request the configuration until it is successful
+ let network_config: PublicHotShotConfig = loop {
+ match reqwest::get(config_url.clone()).await {
+ Ok(resp) => match resp.json::().await {
+ Ok(config) => break config,
+ Err(e) => {
+ tracing::error!("Failed to parse the network config: {e}");
+ sleep(Duration::from_secs(5)).await;
}
- }
- Ok(false) => {
- tracing::info!("Peers' keys are not ready, retrying.");
- }
+ },
Err(e) => {
- tracing::warn!("Orchestrator error {e}, retrying.");
+ tracing::error!("Failed to fetch the network config: {e}");
+ sleep(Duration::from_secs(5)).await;
}
}
- sleep(Duration::from_secs(2)).await;
+ };
+
+ // Create empty stake table
+ let mut st = StakeTable::